Lập trình với giao thức UDP Java | DatagramSocket

Tìm hiểu về kỹ thuật lập trình với giao thức UDP Socket Java.

Xem thêm:

lập trình với giao thức TCP Socket Java

ứng dụng chat client server java socket Swing

1. Lớp DatagramPacket

Khái niệm

– Lớp này cho phép truyền thông với giao thức UDP.

– Kế thừa trực tiếp từ lớp Object.

– Gói tin chứa 4 thành phần quan trọng:

  • Địa chỉ: getAddress()
  • Dữ liệu truyền: getData()
  • Kích thước gói tin: getLength()
  • Số hiệu cổng chứa gói tin: getPort()

Khởi tạo

– Gói nhận từ mạng

Public DatagramPacket(byte[] inBuffer, int length)

  • inBuffer: Bộ đệm nhập, chứa gói tin nhận
  • Length: kích cỡ gói tin nhận

Ví dụ:

byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length);

– Gói gửi đi

public DatagramPacket(byte[] outBuffer , int length, InetAddress destination, int port)

  • outBuffer: Bộ đệm xuất chứa dữ liệu gói tin gửi đi
  • length: kích cỡ gói tin tính theo byte
  • destination: Địa chỉ nhận gói tin
  • Port số hiệu cổng đích nơi nhận gói tin

Ví dụ:

String str = "Hello";
byte[] data = str.getBytes();
InetAddress ip = InetAddress.getByName("localhost");
DatagramPacket datagramPacket = new
DatagramPacket(data,data.length,ip,3000);

2. Lớp DatagramSocket

Khái niệm

– Cho phép tạo ra đối tượng socket truyền thông với giao thức UDP.

– Socket này cho phép gửi/nhận gói tin DatagramSocket.

Khởi tạo

public DatagramSocket(int port, InetAddress ip)

Ví dụ:

InetAddress ip = InetAddress.getByName("localhost");
DatagramSocket socket = new DatagramSocket(3000, ip);

3. Các phương thức

– Gửi gói tin UDP qua mạng: public void send(DatagramPacket dp)

– Nhận gói tin UDP qua mạng: public void receive(DatagramPacket dp)

– Đóng socket: public void close()

4. Kỹ thuật truyền thông với giao thức UDP

5. Quy trình gửi và nhận giữa client và server

– Phía server:

  • Tạo đối tượng DatagramSocket với số cổng xác định.
  • Khai báo bộ đệm nhập/xuất mảng kiểu byte.
  • Khai báo gói tin nhận/gửi là đối tượng DatagramPacket.
  • Thực hiện nhận/gửi gói tin với receive()/send();
  • Đóng socket kết thúc hoặc quay về chờ gói tin tiếp theo.

– Phía client:

  • Tạo đối tượng DatagramSocket với số cổng bất kỳ.
  • Khai báo bộ đệm xuất/nhập dạng mảng kiểu byte.
  • Khai báo gói tin gửi/nhận là đối tượng DatagramPacket.
  • Thực hiện gửi/nhận gói tin qua phương thức send()/receive().
  • Đóng socket, kết thúc hoặc quay về chờ gói tin tiếp theo.

Chú ý:

  • Chương trình server cần chạy trước, client chạy sau.
  • Client gửi gói tin lên cho server trước.
  • Server nhận gói tin, bóc tách địa chỉ và cổng sau đó gửi trả cho client thông tin sau xử lý.

6. Chương trình gửi nhận giữa client và server UDP Socket

Code tham khảo:

public class Server {

    public final static int SERVER_PORT = 9555;
    public final static byte[] BUFFER = new byte[4069];

    public static void main(String[] args) {
        String s;

        try {
            System.out.println("Dang doi ket noi...");
            DatagramSocket ds = new DatagramSocket(SERVER_PORT);
            while (true) {
                DatagramPacket in = new DatagramPacket(BUFFER, BUFFER.length);
                ds.receive(in);

                //Lay du lieu goi tin
                String inStr = new String(in.getData(), 0, in.getLength());
                System.out.println("Client: " + inStr);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
public class Client {

    public static String SERVER_IP = "localhost";
    public static int SERVER_PORT = 9555;
    public final static byte[] BUFFER = new byte[4069];

    public static void main(String[] args) {
        String s;
        try {
            DatagramSocket ds = new DatagramSocket();
            Scanner sc = new Scanner(System.in);
            System.out.println("Message: ");
            s = sc.nextLine();

            byte[] sendData = s.getBytes();

            InetAddress inetAddress = InetAddress.getByName(SERVER_IP);
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, inetAddress, SERVER_PORT);
            ds.send(sendPacket);
            
            ds.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Trên đây là hướng dẫn lập trình với giao thức TCP Socket Java. Cảm ơn bạn đã tham khảo môn lập trình mạng trên ttnguyen.net.

Bài viết liên quan:

Lớp URL trong java

InetAddress trong java

Server chuyển xâu thành chữ in hoa rồi gửi lại Client

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em