CHƯƠNG 6 LẬP TRÌNH VỚI GIAO THỨC UDP
6.4 Lập trình UDP theo mô hình Client/Server
Trong mô hình lập trình UDP Client/Server đều sử dụng hai lớp
DatagramSocket và DatagramPacket cho cả phía Client và Server. Tuy nhiên cách sử dụng hai lớp này ở phía Client và Server là khác nhau trong các constructor.
Quan sát mô hình trên Hinh 6.2, ta thấy rằng để tạo một giao tiếp bằng UDP, phía máy chủ sẽ tạo ra một socket và ràng buộc trên một cổng nhất định nào đó.
Muốn gửi dữ liệu (hoặc yêu cầu) thì phải biết trước các thông tin liên quan như địa chỉ mạng, cổng kết nối của máy nhận. Máy gửi sẽ tạo ra một socket dùng cho việc gửi dữ liệu. Máy gửi tạo ra một DatagramPacket với các thông tin như dữ liệu,
chiều dài dữ liệu, địa chỉ mạng, cổng kết nối của máy nhận. Chúng ta sẽ gọi tới socket đã tạo và gửi packet đi.
Hình 6.2: Mô hình Client/Server theo kỹ thuật lập trình với giao thức UDP
Đoạn chương trình để gửi dữ liệu bằng giao thức UDP: DatagramSocket socket = new DatagramSocket();
byte[] data = inputStr.getBytes();
InetAddress host = InetAddress.getByName("localhost"); int port = 3210;
DatagramPacket sPacket = new DatagramPacket(data,data.length,host,port); socket.send(sPacket);
Phía máy nhận muốn nhận dữ liệu thì sẽ tạo ra một socket để gửi/nhận dữ liệu. Nếu đã có socket rồi thì có thể sử dụng lại. Sau đó, máy nhận tạo ra một packet với thông tin về biến nhớ đệm và độ dài dữ liệu. Sau đó, chúng ta sẽ dùng socket để nhận dữ liệu.
Đoạn chương trình để gửi dữ liệu bằng giao thức UDP: DatagramSocket socket = new DatagramSocket();
byte[] buffer = new byte[65507];
DatagramPacket rPacket = new DatagramPacket(buffer,buffer.length); socket.receive(rPacket);
Trong đoạn mã trên, 65507 được dùng làm kích thước của dữ liệu nhận. Đây
là kích thước lớn nhất có thể dùng. Tuy nhiên, trên thực tế khi dùng ta có thể sử dụng số bé hơn.
Để đọc thông tin của packet nhận được, ta có đoạn mã sau:
InetAddress host = rPacket.getAddress(); //Địa chỉ mạng của m‡y gửi int port = rPacket.getPort(); //Cổng của m‡y gửi
byte[] data = rPacket.getData(); //Dữ liệu nhận được //Tạo x‰u từ dữ liệu nhận được
String str = new String(data,rPacket.getOffset(),rPacket.getLength()); Thông tin đọc được từ phía máy gửi có thể dùng để gửi lại phản hồi sau này. Nói một cách chính xác thì thông tin địa chỉ mạng và cổng sẽ dùng để đóng gói thông tin qua một DatagramPacket dùng để gửi phản hồi cho máy vừa gửi thông tin. Điều này cũng giống như việc gửi thư, khi nhận được thư ta thường đọc thông tin của người gửi (nếu không biết trước) trên phong bì thư để gửi lại thư phản hồi.