Lập trình java muticast hình ảnh
Trang 1Đại Học Quốc Gia Tp.HCMTrường Khoa Học Tự Nhiên Tp HCM Khoa Điện Tử Viễn Thông
Trang 2MỤC LỤC
Đọc các hình ảnh từ các hệ thống tập tin 28
Trong addintion để gửi ảnh chụp màn hình ứng dụng cũng có thể gửi hình ảnh được lưu trữ trong hệ thống tập tin Các ứng dụng sẽ đọc các định dạng ảnh JPEG từ một thư mục theo thứ tự ngẫu nhiên .28
công getRandomImageFromDir BufferedImage tĩnh (File dir) throws IOException {String [] hình ảnh = dir.list (mới ImageFileFilter ()); 28
int ngẫu nhiên = new Random () nextInt (images.length) 28
String FileName = dir.getAbsoluteFile () + File.separator + hình ảnh [ngẫu nhiên]; 28
Tập tin imageFile = new File (tên tập tin); 28
trở lại ImageIO.read (imageFile);} 28
ImageFileFilter lớp thực hiện FilenameFilter{ 28
boolean nào chấp nhận (File dir, String name){ 28
String nameLc = name.toLowerCase (); 28
trở lại nameLc.endsWith (" jpg")? true : false; đúng: đúng;}} 29
Các giới hạn 65507 byte có thể được enought cho hình ảnh nhỏ, nhưng đối với ảnh chụp màn hình toàn màn hình nó sẽ không được đầy đủ Nó sẽ có thể quy mô xuống các hình ảnh để chúng phù hợp với một gói UDP duy nhất nhưng điều này sẽ làm cho những hình ảnh khó xem Trong giải pháp của chúng tôi, chúng tôi sẽ chia ra các hình ảnh vào một cách thích hợp khối có kích thước và chuyển chúng qua mạng Như đã đề cập ở trên UDP không có người điều khiển giao thông xây dựng bên trong, vì vậy chúng tôi phải chăm sóc cho chính mình 29
Kiểm soát giao thông 29
Để chắc chắn rằng những hình ảnh truyền qua đường lát được tập hợp lại theo thứ tự đúng một số tiêu đề được thêm vào các gói UDP Điều này sẽ làm giảm lượng dữ liệu có thể được chuyển giao trong một gói tin, nhưng đó phải được chấp nhận 29
29
Người gửi quyết định kích thước của mỗi slize hình ảnh, sau đó nó sẽ gửi các slice người một qua mạng cùng với tiêu đề bổ sung thông tin mô tả ở trên Theo thông tin được đưa ra trong thông tin tiêu đề bổ sung thu hình ảnh có thể xác định kích thước cuối cùng của hình ảnh, vị trí của dữ liệu hình ảnh hiện tại và thời tiết hình ảnh được hoàn thành 29
1 GIỚI THIỆU
1.1 Giới thiệu
Trang 3Ngày nay mạng máy tính đã phát triển với tốc độ rất nhanh chóng và việc trao đổi thông tin trên mạng là điều tất yếu Cùng với tốc độ phát triển
là sự ra đời của nhiều công nghệ mạng, các công nghệ này sử dụng các giao thức kết nối khác nhau (TCP, UDP: tuỳ vào mục đích sử dụng), làm cho việc trao đổi dữ liệu trên mạng được nhanh chóng, chính xác và hiệu quả Multicast ra đời cũng nhằm phục vụ cho một trong những mục đích trên
Để trao đổi dữ liệu Multicast sử dụng giao thức UDP Điểm mạnh của multicast là có thể truyền tải dữ liệu với tốc độ cao và dữ liệu chỉ gửi đi một lần
Có 2 loại ứng dụng multicast chính:
- Ứng dụng không cần khôi phục dữ liệu mất: Ví dụ như những ứng dụng truyền tải hình ảnh và âm thanh, có thể méo dạng ở mức cho phép
- Ứng dụng cần khôi phục dữ liệu mất: Ví dụ như ứng dụng Ghost của Synmantec hoặc Multicast truyền nhận của chúng ta Trong những ứng dụng này cần đảm bảo tính toàn vẹn của dữ liệu, nếu chỉ cần mất một bit thì dữ liệu của chúng ta sẽ bị hỏng nên cần có cơ chế khôi phục dữ liệu Do UDP thì không có cơ chế tự khôi phục dữ liệu nên phần mềm phải đảm nhiệm vai trò này
1.2 Multicast là gì?
Multicast là công nghệ dùng để truyền tải dữ liệu từ một nguồn đến một nhóm máy tính muốn nhận dữ liệu đó (một tiến trình gửi và nhiều tiến trình nhận) Để nhận dữ liệu thì các máy thành viên của nhóm cần kết nối đến một địa chỉ Multicast và dữ liệu nguồn sẽ gửi dữ liệu lên đó
Từ một khía cạnh nào đó thì multicast giống như hệ thống radio hay
TV Nếu kênh được phát đi chúng ta có thể đồng thời nghe hoặc xem cùng một kênh giống như những người khác
Ví dụ mô hình multicast:
Trang 4Ví dụ multicast và unicast:
Ba kỹ thuật trong việc quản lí sự phân phát multicast trên mạng là: scoping, group management, và distribution trees
Trang 51.3 Multicast Scoping
IP Multicast sử dụng một tham số Time To Live (TTL) trong header từng gói dữ liệu của các ứng dụng IP Multicast Các router căn cứ vào giá trị TTL của gói dữ liệu này để quyết định xem gói dữ liệu này có được phép đi qua hay không Khi chúng ta đặt giá trị TTL trong một ứng dụng IP
Multicast là n thì những gói dữ liệu này không thể đi quá n router Ví dụ,
nếu chúng ta đặt Site Server's Active Channel Multicaster có giá trị TTL tới 16, để đảm bảo rằng Site Server's Active Channel Multicaster không vượt qua quá 16 router Đúng như trong unicast, mỗi thời gian một multicast router chuyển một gói multicast, router giảm bớt giá trị TTL của gói dữ liệu đi một đơn vị Nếu giá trị TTL =0 thì router sẽ huỷ gói dữ liệu này Trên mỗi interface (cổng giao tiếp mạng) của router chúng ta có thể quy định giá trị TTL mặc định Ví dụ, nếu chúng ta đặt ngưỡng TTL là 10 trên một interface thì chỉ những gói dữ liệu với giá trị TTL lớn hơn 10 mới
có thể đi qua được interface đó
Cơ bản multicast scoping có hai khuyết điểm:
- Việc xác định một giá trị TTL thích hợp cho một ứng dụng
multicast là khó khăn
- Nếu người nào đó đặt ngưỡng TTL theo thói quen trên các
interface của router thì phạm vi hoạt đông của những ứng dụng multicast có thể không đoán trước được
Trang 6Để khắc phục được những giới hạn này, the Internet Engineering Task Force (IETF) đưa ra Administratively Scoped IP Multicast như là một chuẩn Internet RFC 2365 in July 1998 IETF có những địa chỉ IP multicast được chỉ định trong khoảng 239.0.0.0 và 239.255.255.255 như là những địa chỉ administratively scoped cho việc sử dụng mạng cục bộ Chúng ta có thể cấu hình các router hỗ trợ các địa chỉ administratively scoped trên các đường bên trong mạng của chúng ta để hạn chế vùng multicast riêng của chúng ta Chúng ta cũng có thể định nghĩa nhiều vùng multicast được cô lập trong mạng của chúng ta như thế dữ liệu multicast sẽ chỉ di chuyển trong vùng được chỉ định
1.4 Multicast Group Management
Một multicast network chỉ chuyển dữ liệu multicast cho các mạng con có các máy nhận nằm trong một nhóm multicast tương ứng trong một vùng multicast Sự chuyển dữ liệu có chọn lọc này là sự khác biệt lớn nhất giữa multicast và broadcast (broadcast gửi dữ liệu tới tất các mạng con)
Để chuyển dữ liệu multicast tới các máy nhận trong một vùng multicast, router cần thông tin về sự tham gia của các thành viên trên các mạng con cục bộ của chúng Một router trên mỗi mạng con sẽ gửi định kỳ các thông điệp (message) tới tất cả các máy tính trên mạng con cục bộ Các máy tính trên mạng con cục bộ trả lời các messages này của router Bằng cách này router sẽ xây dựng cho mình một bảng thông kê các thành viên của nhóm mà chúng có liên quan Khi các thành viên của nhóm khác nhận một thông báo máy tính thành viên thì các thành viên của nhóm hoãn các báo cáo tham gia của chúng và đợi một biến chu kỳ thời gian Thời gian đợi này làm giảm lưu thông báo cáo tham gia và thời gian xử lí của router Miễn là một router biết rằng một nhóm các thành viên trên mạng con cục
bộ, router chuyển dữ liệu multicast tới mạng con đó và các thành viên của nhóm khác sẽ nhận dữ liệu multicast Khi một thành viên mới muốn join một nhóm, thành viên không cần đợi câu hỏi tiếp theo từ router Thay vào
đó, thành viên mới ngay lập tức gửi một báo cáo tham gia như là sự trả lời
Trang 7tới câu hỏi tham gia Khi router nhận báo cáo này, ngay lập tức nó chuyển
dữ liệu multicast tới mạng con mà trên đó thành viên mới hiện diện nếu thành viên mới là thành viên đầu tiên của nhóm mạng con multicast đó (Hình bên)
IETF đang làm việc trên IGMPv3 để cải tiến IGMPv2 IGMPv3 sẽ bao gồm các đặt tính mới Một trong các đặc tính mới là xác nhận được máy tính nào trong nhóm sẽ nhận dữ liệu từ nguồn
1.5 Multicast Distribution Trees
Sử dụng thông tin thành viên IGMP của router, một multicast routing protocol xây dựng một distribution tree để chuyển dữ liệu multicast
từ một nguồn đến nhóm multicast Có hai loại distribution tree: based và shared
source-Khi router kết nối đến nguồn để nhận gói dữ liệu multicast đầu tiên, router sẽ chuyển gói dữ liệu đến các đỉnh của mạng để tìm máy nhận Sau khi kiểm tra IGMP nếu một router trên mạng không tìm thấy máy nhận nào,
router đó sẽ gửi một thông điệp prune (prune message) đến router cha gần
nó nhất trên đường đến nguồn Prune message sẽ loại router đó Một distribution tree chỉ chứa những router có máy nhận trên nhánh Giao thức này sẽ gửi tiến trình broadcast and prune một cách định kỳ trong lúc multicast cập nhật distribution tree và phản hồi đến các thành viên
Trang 8Một multicast routing protocol sử dụng tiến trình prune để thiết lập một source-based tree là một giao thức broadcast-and-prune Bởi vì giao thức broadcast-and-prune làm cho broadcast tuần hoàn, những giao thức này chỉ thích hợp cho việc sử dụng trong những môi trường LAN có nhiều băng thông và nhiều máy nhận Sự bất lợi khác của việc sử dụng giao thức broadcast-and-prune là nếu hai nguồn khác nhau gửi
broadcast-and-dữ liệu cho cùng một nhóm multicast thì giao thức đó phải tạo ra một source-based distribution tree cho mỗi nguồn
Trái ngược với source-based tree, shared-tree có thể hỗ trợ nhiều nguồn dữ liệu multicast tới cùng một nhóm multicast sử dụng cùng distribution tree Shared tree thích hợp cho môi trường có máy nhận phân tán rải rát trên một băng thông nhỏ trong môi trường WAN Một giao thức shared-tree hoặc tự động chọn hoặc để cho người quản trị mạng định nghĩa gốc của một shared tree trong một mạng Gốc là một router, được biết như
là một điểm trung tâm (core) hoặc điểm gặp nhau (rendezvous point) Các gốc thường là trung tâm của các nhóm multicast Khi một router của nguồn nhận dữ liệu multicast thì router sẽ chuyển dữ liệu tới điểm trung tâm của nhóm multicast Điểm trung tâm sẽ chuyển dữ liệu tới tất cả các máy nhận
Trang 9trong nhóm Shared tree không thiết lập việc sử dụng broadcast-and-prune
để tìm nhóm thành viên nhưng phụ thuộc vào tất cả các thành viên kết nối vào cây Khi một router tìm thấy một nhóm thành viên thông qua viêc kiểm tra IGMP, router sẽ gửi yêu cầu kết nối đến điểm trung tâm Điểm trung tâm hoặc router trung gian sẽ trả lời yêu cầu với một kết nối ack và gửi ack đến router yêu cầu
1.6 Các vấn đề với Unicast
Unicast không giống như Multicast Khi ta gửi một gói dữ liệu (packet) nếu chỉ có một tiến trình gửi và một tiến trình nhận thì đây chính là unicast Có hai giao thức truyền dữ liệu chính trên mạng là: TCP và UDP TCP chính là unicast UDP có thể là unicast trong trường hợp chúng ta gửi những packet UDP và chỉ có một tiến trình nhận duy nhất Trường hợp ngược lại nó có thể là broadcast hoặc multicast
Unicast thống lĩnh trên mạng internet trong nhiều năm cho đến năm
1993 khi mà Multicast ra đời nó đã làm thay đổi vai trò truyền dữ liệu trên mạng internet bởi những lợi ích mà nó đem lại Những trang web mạnh ra đời, mọi người có thể nghe và nhìn thấy nhau
Với các công nghệ mạng ngày nay thì chúng ta có đủ khả năng tài chính để chi trả cho những kết nối unicast đến tất cả những ai muốn truy cập vào trang web của chúng ta Tuy nhiên, nếu các ứng dụng web của chúng ta tương trợ các dịch vụ âm thanh và hình ảnh thì chúng ta cần một băng thông khổng lồ cho các ứng dụng này Trước khi multicast ra đời thì
có 2 giải pháp: thiết lập một kết nối unicast riêng biệt đối với mỗi người nhận hoặc sử dụng broadcast
Giải pháp đầu tiên không thuận lợi vì mỗi kết nối đơn gửi dữ liệu âm thanh/hình ảnh đều cần một băng thông lớn mà chúng ta có thể có hàng trăm hoặc thậm chí hàng ngàn kết nối như vậy thì cả hệ thống mạng của
chúng ta có thể bị sụp đổ Ví dụ Unicast video/audio transmission:
Trang 10Broadcast dường như là một giải pháp nhưng nó chưa là giải pháp tốt Nếu chúng ta muốn tất cả các máy tính trong một mạng LAN nhận dữ liệu đồng thời từ một máy gửi thì chúng ta có thể sử dụng broadcast Những
dữ liệu sẽ được gửi đồng thời một lần đến tất cả các máy tính nhận theo địa chỉ broadcast của mạng tương ứng Vấn đề khó khăn chỉ xảy ra khi máy tính gửi và máy tính nhận ở hai mạng LAN khác nhau, bởi vì các trang thiết
bị mạng lớp thứ 3 (router) không cho phép các gói dữ liệu có địa chỉ máy đích là broadcast đi qua
Giải pháp duy nhất còn lại là multicast Thông qua multicast chúng
ta gửi dữ liệu đến một địa chỉ đặc biệt (giống như tần số của radio/video) Tất cả các máy tính muốn nhận dữ liệu này đều phải kết nối đến địa chỉ đặc biệt trên Từ một khía cạnh nào đó thì multicast giống như broadcast Điều khác biệt cơ bản giữa chúng là dữ liệu multicast truyền được trên hệ thống mạng còn broadcast chỉ hoạt động trong môi trường một mạng LAN duy
nhất Ví dụ Multicast video/audio transmission :
Trang 111.7 Địa chỉ multicast
Địa chỉ Multicast là địa chỉ thuộc lớp D với các giá trị nằm trong khoảng từ 224.0.0.0 239.255.255.255
Mỗi IP datagram có địa chỉ đích bắt đầu bằng 4 bits “1110” là một
IP Multicast datagram 28 bits còn lại dùng để xác định nhóm (group) mà datagram được gửi tới Tương tự như việc chúng ta điều chỉnh tần số để nghe một chương trình nào đó được phát ra trên tần số đó, chúng ta có thể điều chỉnh để nhận được những packet gửi lên một nhóm multicast đã xác định Điều đó có ý nghĩa là các máy tính đã được kết nối với nhau vào một nhóm trên interface đã được xác định
1.8 Hình ảnh là gì?
Hình ảnh là tập hợp của vô số điểm ảnh nhỏ tạo thành hình ảnh Độ sắc nét của hình ành p thuộc số ượng điểm ảnh mà mắt ta (thiết bị) phân giải cho pixel
Do vậy, việc truyền hình ảnh có thể cho phép méo dạng cho phép, các điểm ảnh có thể mất đi nhưng nhờ các thuật toán sửa lỗi sẽ phục hồi lại điểm anh 2 lân cạnh mà không mất tính khác biệt với ảnh gốc Giao thức UDP sẽ là giao thức lượt chọn hàng đầu trong truyền dẫn hình ảnh Trong một số truyền đặc biệt thì người ta dùng TCP truyền hình ảnh
Trang 122 MỤC ĐÍCH
Áp dụng các tính năng của công nghệ Multicast để xây dựng chương trình Multicast hình ảnh dùng để truyền dữ liệu từ một máy tính (server) đến đồng thời nhiều máy tính khác (client) trên một mạng LAN
- UDP là kết nối không tin cậy, dữ liệu đi từ nguồn đến đích theo nhiều đường khác nhau và không theo thứ tự Khi dữ liệu được gửi
đi máy tính nguồn sẽ không quan tâm và không biết được dữ liệu
có đến đích nguyên vẹn và theo đúng thứ tự hay không UDP không có cơ chế tự kiểm tra lỗi và khôi phục dữ liệu Đây là trở ngại lớn nhất cho những ứng dụng được xây dựng trên nền tảng kết nối UDP, bởi vì sự mất mát và lỗi của dữ liệu trong quá trình truyền tải là không tránh khỏi Để giải quyết vấn đề này chúng ta cần phải tự xây dựng cho mình một cơ chế kiểm tra lỗi và khôi phục dữ liệu
Trong ứng dụng Muticast hình ảnh, chúng ta sử dụng cả 1 loại kết nối UDP, trong một trường hợp nâng cao hiệu quả và tính toàn vẹn của dữ liệu TCP là sự lưạ trong quá trình gửi và nhận
TCP được sử dụng trong những kết nối đòi hỏi sự chính xác, như việc trao đổi thông tin giữa client và server hoặc việc kết nối từ client đến server Dung lượng thông tin trao đổi trong những kết nối TCP này rất nhỏ nên không làm ảnh hưởng nhiều đến tốc độ của chương trình mà còn làm tăng hiệu quả
Trang 13của nó Điều đó có nghĩa là kết nối TCP được sử dụng để gửi các thông báo giữa client và server.
UDP được sử dụng để gửi dữ liệu từ server đến client Quá trình này chiếm nhiều thời gian và băng thông nhất, đồng thời sự mất mát và lỗi của dữ liệu xảy ra chủ yếu trong giai đoạn này
Dữ liệu UDP gửi từ nguồn đến đích đi theo nhiều đường khác nhau.Vấn
đề đặt ra là làm sao máy đích biết được gói dữ liệu nào là trước dữ liệu nào là sau mà sắp xếp cho đúng thứ tự và làm sao biết được gói dữ liệu đó có đầy đủ hay không
Như chúng ta đã biết độ lớn tối đa của một gói dữ liệu trao đổi trên mạng hiện nay là 64KB, nhưng file mà ta cần truyền có độ lớn gấp nhiều lần so với một gói dữ liệu Như vậy thì chúng ta cần chia file này ra thành nhiều phần
có độ lớn thích hợp để gửi qua mạng Đồng thời để cho máy đích kiểm tra được
sự mất mát và lỗi mà sắp xếp dữ liệu theo đúng thứ tự, chúng ta cần định nghĩa
ra một cấu trúc dữ liệu mới như sau:
Packet gồm 3 phần:
- Phần header gồm có: COMMAND, INDEX và LENGTH
- Phần nội dung: DATA
- Phần kiểm tra lỗi: CRCTrong đó:
COMMAND có độ lớn 1byte: là thông số của packet Nếu COMMAND
= 1 thì packet này thông báo cho client biết đây là gói dữ liệu cuối cùng Nếu COMMAND = 2 thì DATA là dữ liệu của file copy
INDEX có độ lớn 4bytes (int): là chỉ số của packet Mỗi packet có một chỉ số riêng Số này cũng chính là số thứ tự của gói dữ liệu khi gửi Các máy
DATACRC
Trang 14đích sẽ sử dụng chỉ số này để sắp xếp các gói dữ liệu vào vị trí tương ứng trong file.
LENGTH có độ lớn 4bytes (int): là chiều dài của toàn packet
DATA là dữ liệu được lấy từ file (mảng byte)
CRC có độ lớn 8 bytes: là dữ liệu dùng để client kiểm tra tính toàn vẹn của gói dữ liệu Nghĩa là client sẽ so sánh số CRC của packet mà server gửi với CRC mà client tính được dựa trên các giá trị trong gói dữ liệu mà nó nhận được Nếu hai số này bằng nhau thì packet này toàn vẹn, ngược lại gói dữ liệu lỗi Để tính số CRC ta dùng đối tượng CRC32 trong Java Đối tượng này sẽ update lần lươt các giá trị COMMAND, INDEX, LENGTH, DATA vào đối tượng CRC32 và nó sẽ lấy ra một số có chiều dài 8bytes (long) số này chính là CRC Số này sẽ được đóng gói vào phần cuối của packet Client sẽ dựa vào số CRC này để kiểm tra packet có đầy đủ không
Cách lấy dữ liệu từ file:
// tạo ra đối tượng RandomAccessFile và truyền vào file cần lấy hay ghi //dữ liệu
RandomAccessFile raFile = new RandomAccessFile(file, “r”);
Trang 15raFile.seek(INDEX); // hàm seek dùng để di chuyển con trỏ đến //một vị trí INDEX trong file Vị trí này chính là số INDEX của DATA
INDEX++; // tăng INDEX lên một đơn vị byteRead = raFile.read(buffer, 0, byteRead); // dùng để lấy DATA từ file
}
Cách ghi dữ liệu vào file:
this.raFile.seek(INDEX); // trước khi ghi dữ liệu raFile sẽ di chuyển con trỏ đến INDEX INDEX lấy từ packet vừa nhận
this.raFile.write(data, 0, length);// hàm này dùng để ghi dữ liệu vừa nhận được vào file tại vị trí INDEX.
Chúng ta đã xây dựng được một cấu trúc dữ liệu Vậy làm cách nào
để chuyển gói dữ liệu này qua mạng?
Java cung cấp cho chúng ta đối tượng Serializable dùng để truyền
dữ liệu trên mạng Muốn truyền đối tượng nào qua mạng chỉ cần đối tượng
đó hiện thực (implements) đối tượng Serializable là nó có khả năng trao đổi trên mạng Nhưng sau khi kiểm tra chúng tôi thấy rằng nếu dùng đối tượng Serializable thì độ lớn của đối tượng hiện thực nó tăng lên khá nhiều so với
dữ liệu thực tế cần gửi Điều này làm giảm tốc độ của chương trình vì nó mất nhiều thời gian gửi hơn Do đó dùng đối tượng Serializable không hiệu quả
Cách giải quyết tốt nhất là làm thế nào để cho độ lớn của gói dữ liệu khi gửi bằng độ lớn thực tế của nó và việc thao tác trên các trường của gói
dữ liệu này được dễ dàng
Để đóng gói và lấy các thành phần của packet ta xây dựng đối tượng ByteStream Đối tượng này cung cấp các phương thức reader và writer để ghi các thành phần vào packet và đọc các thành phần này ra
Các phương thức reader:
Trang 16public byte readByte() // đọc 1 bytepublic short readShort() // đọc 2 bytespublic int readInt() // đọc 4 bytespublic long readLong()// đọc 8 bytespublic byte[] readArray(int len) // đọc một mảng bytespublic long readCRC() // đọc số CRC 8 bytes.
Các phương thức writer:
public void writeByte(byte b) // ghi 1 bytepublic void writeShort(short s) // ghi 2 bytespublic void writeInt(int i) // ghi 4 bytespublic void writeLong(long l) // ghi 8 bytespublic void writeArray(byte[] array) // ghi mang bytes array
Như đã giới thiệu điểm mạnh của multicast là dùng kết nối UDP để gửi
dữ liệu một lần lên địa chỉ multicast những client nào muốn nhận dữ liệu thì chỉ kết nối vào địa chỉ multicast này và nhận dữ liệu Địa chỉ multicast này là một địa chỉ thuộc lớp D Nếu dùng kết nối TCP thì mỗi client muốn nhận dữ liệu phải tạo và duy trì một kết TCP giữa client và server Nếu có hàng trăm hoặc hàng ngàn kết nối được duy trì như vậy phải cần một băng thông rất lớn làm như vậy thì hệ thống mạng của chúng ta có thể sụp đổ
Quá trình gửi và nhận dữ liệu của file sử dụng kết nối UDP(multicast)
để thực hiện việc kết nối vào địa chỉ multicast, gửi và nhận dữ liệu lên địa chỉ
đó Để thực hiện kết nối và gửi dữ liệu multicast Java cung cấp hai lớp MulticastSocket và DatagramPacket để sử dụng dễ dàng
Ví dụ:
Gửi dữ liệu:
MulticastSocket ms = new MulticastSocket();
// data là phần dữ liệu cần gửi đi.
DatagramPacket dp = new DatagramPacket(data, data.length, ia, port);
Trang 17//Kết nối vào nhóm multicast với địa chỉ ia thuộc lớp D.
ms.joinGroup(ia);
// gửi dữ liệu dp ms.send(dp);
Nhận dữ liệu:
MulticastSocket ms = new MulticastSocket( port );
// tạo một đối tượng DatagramPacket DatagramPacket dp = new DatagramPacket(data, length);
//Kết nối vào nhóm multicast với địa chỉ ia trùng với địa chỉ của máy //gửi
ms.joinGroup(ia);
// Nhận dữ liệu ms.receive(dp);
Việc kiểm tra các packet bị mất và yêu cầu server gửi lại có 2 giải pháp:
- Kiểm tra packet mất trong lúc nhận và yêu cầu server gửi lại ngay packet này
- Kiểm tra packet mất trong lúc nhận và yêu cầu server gửi lại khi client đã nhận xong dữ liệu
Giải pháp thứ nhất không hiệu quả vì nó sẽ làm giảm tốc độ của chương trình Nếu làm như vậy thì cứ mỗi client bị mất thì sẽ yêu cầu server gửi lại, có thể có nhiều client mất những packet giống nhau như vậy server sẽ gửi lại những packet đó nhiều lần điều này không cần thiết và nó làm giảm hiệu quả của chương trình
Giải pháp thứ hai hiệu quả hơn vì khi các client nhận xong dữ liệu một lần rồi mới yêu cầu server gửi lại những packet đó Như vậy server sẽ kiểm tra tất cả các yêu cầu gửi packet mất của từng client rồi mới gửi lại những packet
đó một lần Do đó làm tăng tính hiệu quả của chương trình
Phương pháp kiểm tra packet: