Chương IV - Kết Nối SOCKET Sử Dụng UDP

Màu nền
Font chữ
Font size
Chiều cao dòng

 I, Lập Trình UDP :

- Việc cài đặt ứng dụng UDP trong Java cần có hai lớp là DatagramPacket và DatagramSocket.

DatagramPacket đóng gói các byte dữ liệu vào các gói tin UDP được gọi là datagram và cho phép ta mở các datagram khi nhận được.

Một DatagramSocket đồng thời thực hiện cả hai nhiệm vụ nhận và gửi gói tin. Để gửi dữ liệu, ta đặt dữ liệu trong một DatagramPacket và gửi gói tin bằng cách sử dụng DatagramSocket. Để nhận dữ liệu, ta nhận một đối tượng DatagramPacket từ DatagramSocket và sau đó đọc nội dung của gói tin.

- UDP không có bất kỳ khái niệm nào về liên kết giữa hai host. Một socket gửi tất cả dữ liệu tới một cổng hoặc nhận tất cả dữ liệu từ một cổng mà không cần quan tâm host nào gửi.

- Một DatagramSocket có thể gửi dữ liệu tới nhiều host độc lập hoặc nhận dữ liệu từ nhiều host độc lập. DatagramSocket không dành riêng cho một liên kết cụ thể thể nào cả như trong giao thức TCP.

- Các socket TCP xem liên kết mạng như là một luồng : ta gửi và nhận dữ liệu với các luồng nhập và luồng xuất nhận được từ socket. UDP không cho phép điều này mà ta phải làm việc với từng gói tin. Tất cả dữ liệu được đặt trong datagram được gửi đi dưới dạng một gói tin.

- Gói tin này cũng có thể nhận được bởi một nhóm hoặc cũng có thể bị mất. Một gói tin không nhất thiết phải liên quan đến gói tin tiếp theo. Cho trước hai gói tin, không có cách nào để biết được gói tin nào được gửi trước và gói tin nào được gửi sau.

II, Gửi - Nhận Gói Tin UDP :

1,  Nhận Gói Tin UDP :

Trước khi một ứng dụng có thể đọc các gói tin UDP được gửi bởi các máy ở xa, nó phải gán một socket với một cổng UDP bằng cách sử dụng DatagramSocket, và tạo ra một DatagramPacket sẽ đóng vai trò như là một bộ chứa cho dữ liệu của gói tin UDP.

- Cú Pháp Lệnh Nhận Gói Tin Dữ Liệu :

//Khai Báo

int portSVR=2812;

DatagramSocket socket = new DatagramSocket(portSVR);

DatagramPacket packet;

byte [ ]data;

//Nhận Gói Tin

data = new byte[1024];

packet = new DatagramPacket(data,data.length);

socket.receive(packet);

String st = new String(packet.getData(),0,packet.getLength());

2,  Gửi Gói Tin UDP :

- Lớp DatagramSocket cũng được sử dụng để gửi các gói tin. Khi gửi gói tin, ứng dụng phải tạo ra một DatagramPacket, thiết lập địa chỉ và thông tin cổng, và ghi dữ liệu cần truyền vào mảng byte.

- Nếu muốn gửi thông tin phúc đáp thì ta cũng đã biết địa chỉ và số hiệu cổng của gói tin nhận được. Mỗi khi gói tin sẵn sàng để gửi, ta sử dụng phương thức send() của lớp DatagramSocket để gửi gói tin đi.

- Cú Pháp Lệnh Nhận Gói Tin Dữ Liệu :

//Khai Báo

int portSVR=2812;

DatagramSocket socket = new DatagramSocket(portSVR);

DatagramPacket packet;

byte [ ]data;

//đọc thông tin CLIENT từ gói tin nhận được

InetAddress ipCLT = packet.getAddress();

int portCLT = packet.getPort();

//Gửi Gói Tin

data = st.getBytes();

packet = new DatagramPacket(data,data.length,ipCLT,portCLT);

socket.send(packet);

III, Trình Tự Hoạt Động Máy Chủ UDP :

1, Khai báo cổng kết nối và các biến làm việc :

int portSVR=2812;

DatagramSocket socket = new DatagramSocket(portSVR);

DatagramPacket packet;

byte [ ]data;

2, Nhận gói tin được gửi đến từ máy khách :

data = new byte[1024];

packet = new DatagramPacket(data,data.length);

socket.receive(packet);

String st = new String(packet.getData(),0,packet.getLength());

Dữ liệu nhận về là gói tin được chuyển sang kiểu chuỗi. Nếu muốn đưa sang kiểu DL khác, ta sử dụng parse như sau :

double a = Double.parseDouble(st);

3, Đọc trong gói tin packet, để lấy ra IP và Port của máy khách.Thông tin này giúp máy chủ có thể biết gói tin được gửi đến từ máy nào và dùng nó để trả kết quả về máy khách đó :

InetAddress ipCLT = packet.getAddress();

int portCLT = packet.getPort();

4, Viết hàm xử lý dữ liệu nhận được từ gói tin, hàm này tốt nhất được viết bên ngoài hàm main() :

String kq = CHUHOA(st);

Hàm xử lý được viết bên ngoài hàm main() :

public static String CHUHOA(String st)

{

          return st.toUpperCase();

}

5, Gửi trả kết quả xử lý về cho máy khách :

data = kq.getBytes();

packet = new DatagramPacket(data,data.length,ipCLT,portCLT);

socket.send(packet);

6, Kết thúc phiên làm việc của máy chủ :

socket.close();

IV, Trình Tự Hoạt Động Máy Khách UDP :

1, Khai báo các biến làm việc :

DatagramSocket socket = new DatagramSocket();

DatagramPacket packet;

byte [ ]data;

BufferedReader in = new BufferedReader(new

          InputStreamReader(System.in));

String st;

2, Máy khách nhập dữ liệu cần xử lý vào từ bàn phím :

System.out.print("Nhap du lieu : ");

st = in.readLine();

3, Gửi dữ liệu đến máy chủ theo IP và cổng kết nối :

int portSVR = 2812;

InetAddress ipSVR = InetAddress.getByName("tên máy chủ");

data = st.getBytes();

packet = new DatagramPacket(data,data.length,ipSVR,portSVR);

socket.send(packet);

4, Nhận kết quả trả về từ máy chủ :

data = new byte[1024];

packet = new DatagramPacket(data,data.length);

socket.receive(packet);

String kq = new String(packet.getData(),0,packet.getLength());

5, In kết quả nhận được lên màn hình :

System.out.println(“KQ nhan duoc tu may chu la : " + kq);

6, Kết thúc phiên làm việc của máy Khách :

socket.close();

Bạn đang đọc truyện trên: Truyen2U.Pro