Mô hình CLIENT/SERVER sử dụng dịch vụ không kết nối

Trong mô hỉnh Client/server sừ dụng dịch vụ kết nối, các lớp Socket, và ServerSocket sừ dụng giao thức HTTP để trao đổi tin giữa hai máy tính được kết nối với nhau. Một giao thức khác, giao thức không kết nối UDP cho phép chương trình ứng dụng truy cập trực tiếp đến gói tin của dịch vụ chuyển giao giống như giao thức IP. UDP sử dụng đồ hình dừ liệu để trao đổi giữa cảc chương trình Client với Server. Nó là giao thức không định hướng kết nối và nó cho phép các chương trình ứng dụng trao đổi tin với nhau qua mạng với ít thông tin điều khiển nhất nên khá nhanh. Tuy nhiên, độ tin cậy truyền tin thấp vì nó không có cơ chế kiểm tra tính chính xác của dữ liệu truyền.

Mô hình Clíent/Server sử dụng lớp DatagramSocket để cài đặt các Socket ờ máy Server và Client. Thay vì Client kết nối với Server, nó chỉ cần gùi dừ liệu đến cho Server bằng cách sử dụng sendto (). Ngược lại, Server sừ dụng lời gọi recvf rom () để chờ đợi dữ liệu từ Client gửi đến. Phương thức recvfrom() cho lại địa chỉ của Client, nhờ đó Server cơ thể gửi kết quả trà lời cho Client như hình 3.7.

Để đóng gói dữ liệu gửi và nhận qua UDP ta sừ dụng lớp DatagramPacket. Lớp này có những phương thức sau.

  • get Address () , get Port () để đọc địa chì IP và cổng của đồ hình dữ liệu.
  • getLength (), getData() để nhận số byte và dữ liệu trong đồ hình dữ liệu.

■ setAddress () , setPortO, setLengthO, setDataO để đặt lại địa chỉ, cổng, độ dài và dữ liệu trên đồ hình dữ liệu.

Ví dụ 3.6.

// DatagramApp.java mô tả cách sừ dụng đồ hình dũ liệu Datagramsocket

import java.io.*;

import j ava.util.Date;

import j ava.net.DatagramPacket;

import j ava.net.DatagramSocket;

import j ava.net.InetAddress;

public class DatagramAppt public static void main(string arg[3){ try!

DatagramSocket dsk = new DatagramSocket(1234); String localAddress =

InetAddress.getLocalHost().getHostName(); int lp = dsk.getLocalPort();

System, out. println (“Địa chi máy địa phuong: ” + local Address);

System.out.println(“Máy chù chò ở cồng: ” + lp);

int i = 256;

byte outBuffer[];

byte inBuffer[] = new byte[i];

DatagramPacket odg;

DatagramPacket idg =

new DatagramPacket(inBuffer, inBuffer.length); boolean finished = false; do {

dsk.receive(idg);

InetAddress dadd = idg.getAddress();

String dbst = dadd.getHostName(); int dpt = idg.getPort();

System.out.println(“Nhận dữ liệu từ: ” + dbst + “o cong: ” + dpt);

String dt = new string(ìdg.getData ());

System.out.println(“Dữ liệu chứa là: ” + dt); finished = true;

String tm = new Date().toString{);

outBuffer = tm.getBytes();

odg = new DatagramPacket(outBuffer,

outBuffer.length, dadd, dpt); dsk.send(odg);

System.out.println(“Sent: ” + tm + ” to: ” + dbst + ” at port: ” + dpt);

)while(!finished);

}catch(IOException e){

System.out.println(“Error:” + e);

}

}

}