Ứng dụng chat Client – Server Java | Chế độ UDP, TCP

Trong bài viết này, TTnguyen sẽ giới thiệu về cách thiết kế và triển khai một ứng dụng chat client server java socket đơn giản sử dụng Java Swing, kết nối qua giao thức UDP và TCP.

Xem thêm:

delete file trong java

HttpURLConnection trong java

1. Xây dựng chương trình Client – Server ở chế độ có nối kết (TCP)

Video hướng dẫn viết ứng dụng nhắn tin Client Server Java Swing giao thức TCP:

1.1 Mô hình Client-Server sử dụng Socket ở chế độ có nối kết (TCP)

Mô hình Client-Server sử dụng Socket ở chế độ có nối kết (TCP)

1.2 Code file chat Server

DefaultListModel model;
ObjectInputStream objIn;
ObjectOutputStream objOut;

public Server() {
    initComponents();
    model = new DefaultListModel();

    try {
        int port = 69;

        model.addElement("Server dang doi ket noi...");
        lsChat.setModel(model);

        //Tao socketserver va doi ket noi
        ServerSocket serverSocket = new ServerSocket(port);
        Socket socket = serverSocket.accept();

        //Hien thi thong tin ket noi
        model.addElement("Connected " + socket);
        lsChat.setModel(model);

        //Khoi tao ObjectInputStream va ObjOutputStream
        objIn = new ObjectInputStream(socket.getInputStream());
        objOut = new ObjectOutputStream(socket.getOutputStream());

        new Thread(new Runnable() {
            @Override
            public void run() {
                ReceiveMsg();
            }
        }).start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void ReceiveMsg() {
    while (true) {
        try {
            //Doc chuoi tin nhan tu ObjInputStream
            String receiveMsg = (String) objIn.readObject();

            //Hien thi tin nhan
            model.addElement("Client: " + receiveMsg);
            lsChat.setModel(model);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {                                        
    try {
        //Lay tin nhan tu txtMsg
        String message = txtMsg.getText();

        //Gui tin nhan den Server thong qua objOutputStream
        objOut.writeObject(message);
        objOut.flush();
        
        txtMsg.setText("");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

1.3 Code file chat Client

DefaultListModel model;
ObjectInputStream objIn;
ObjectOutputStream objOut;

public Client() {
    initComponents();
    model = new DefaultListModel();

    int port = 69;
    String ip = "localhost";

    try {
        //Tao Socket ket noi den may chu
        Socket socket = new Socket(ip, port);

        model.addElement("Connected to " + socket);
        lsChat.setModel(model);

        //Khoi tao ObjectInputStream va ObjOutputStream
        objOut = new ObjectOutputStream(socket.getOutputStream());
        objIn = new ObjectInputStream(socket.getInputStream());

        new Thread(new Runnable() {
            @Override
            public void run() {
                ReceiveMsg();
            }
        }).start();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void ReceiveMsg() {
    while (true) {
        try {
            //Doc chuoi tin nhan tu ObjInputStream
            String receiveMsg = (String) objIn.readObject();

            //Hien thi tin nhan
            model.addElement("Server: " + receiveMsg);
            lsChat.setModel(model);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {                                        
    try {
        //Lay tin nhan tu txtMsg
        String message = txtMsg.getText();

        //Gui tin nhan den Server thong qua objOutputStream
        objOut.writeObject(message);
        objOut.flush();
        txtMsg.setText("");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2. Xây dựng chương trình Client – Server ở chế độ không nối kết (UDP)

Video hướng dẫn viết ứng dụng nhắn tin Client Server Java Swing giao thức UDP:

2.1 Mô hình Client-Server sử dụng Socket ở chế độ không nối kết (UDP)

Mô hình Client-Server sử dụng Socket ở chế độ không nối kết (UDP)

2.2 Code File Chat Server

DefaultListModel model;
public final static byte[] BUFFER = new byte[4069];
DatagramSocket ds = null;
public static int SERVER_PORT = 7;

public Chat_Server() {
    initComponents();
    model = new DefaultListModel();

    try {
        ds = new DatagramSocket(SERVER_PORT);

        model.addElement("Server Started !");
        lsChat.setModel(model);

        new Thread(new Runnable() {
            @Override
            public void run() {
                ReceiveMsg();
            }
        }).start();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

private InetAddress clientAddress;
private int clientPort;

private void ReceiveMsg() {
    while (true) {
        try {

            //Nhan goi tin
            DatagramPacket incoming = new DatagramPacket(BUFFER, BUFFER.length);
            ds.receive(incoming);

            clientAddress = incoming.getAddress();
            clientPort = incoming.getPort();

            // Lay du lieu goi tin
            String mess = new String(incoming.getData(), 0, incoming.getLength());

            //Hien thi
            model.addElement("Client: " + mess);
            lsChat.setModel(model);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {                                        
    try {
        String mess = txtMsg.getText();
        byte[] sendData = mess.getBytes();

        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
        ds.send(sendPacket);

        txtMsg.setText("");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2.3 Code File Chat Client

DefaultListModel model;
DatagramSocket ds = null;
public static String SERVER_IP = "localhost";
public static int SERVER_PORT = 7;
public final static byte[] BUFFER = new byte[4069];

public Chat_Client() {
    initComponents();
    model = new DefaultListModel();

    try {
        ds = new DatagramSocket();
        model.addElement("Client Started !");
        lsChat_client.setModel(model);

        new Thread(new Runnable() {
            @Override
            public void run() {
                ReceiveMsg();
            }
        }).start();
    } catch (Exception e) {
    }
}

private void ReceiveMsg() {
    while (true) {
        try {

            //Nhan goi tin
            DatagramPacket incoming = new DatagramPacket(BUFFER, BUFFER.length);
            ds.receive(incoming);

            // Lay du lieu goi tin
            String mess = new String(incoming.getData(), 0, incoming.getLength());

            //Hien thi
            model.addElement("Server: " + mess);
            lsChat_client.setModel(model);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
private void btnSend_clientActionPerformed(java.awt.event.ActionEvent evt) {                                               
    try {
        String mess = txtMsg_client.getText();
        byte[] sendData = mess.getBytes();

        InetAddress inetAddress = InetAddress.getByName(SERVER_IP);
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, inetAddress, SERVER_PORT);
        ds.send(sendPacket);

        txtMsg_client.setText("");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3. Phân biệt giữa UDP và TCP khi áp dụng vào ứng dụng chat

UDP và TCP là gì?

Giao thức UDP là một giao thức không đảm bảo tính toàn vẹn và cung cấp dịch vụ không có kết nối. Giao thức thường được sử dụng cho các ứng dụng yêu cầu truyền tải nhanh và không cần giao thức kiểm soát lỗi như video streaming hoặc game online.

Giao thức TCP cung cấp một liên kết với tính toàn vẹn dữ liệu và thường được sử dụng cho dịch vụ đòi hỏi tính toàn vẹn và đáng tin cậy như email hoặc truyền tải file.

Xem thêm:

mô hình TCP/IP khái niệm và chức năng

so sánh mô hình tcp/ip và mô hình osi

Ưu điểm và nhược điểm của UDP trong ứng dụng chat

Ưu điểm:

  • Dữ liệu được truyền tải mà không cần thiết lập kết nối trước, giúp giảm thiểu độ trễ trong việc truyền tải thông tin.

Nhược điểm:

  • Do thiếu tính toàn vẹn dữ liệu, việc gửi các tin nhắn chat có thể dẫn đến mất mát thông tin hoặc thứ tự tin nhắn bị thay đổi. Điều này có thể gây ra sự nhầm lẫn hoặc hiện tượng tin nhắn đến không đồng bộ.

Ưu điểm và nhược điểm của TCP trong ứng dụng chat

Ưu điểm:

  • Dữ liệu được xác nhận và nhận thông qua một quá trình đảm bảo chuỗi thứ tự của thông tin, giúp người dùng nhận được tin nhắn theo thứ tự chính xác.

Nhược điểm:

  • Độ trễ trong việc truyền tải do quá trình xác nhận gói tin.

Ứng dụng vào trường hợp cụ thể

Giả sử chúng ta có một ứng dụng chat cần truyền tải các tin nhắn ngắn với tốc độ cao. Trong trường hợp này, việc sử dụng UDP có thể giúp giảm độ trễ trong việc truyền tải, bởi không cần thiết lập kết nối trước. Tuy nhiên, việc này có thể dẫn đến việc mất mát dữ liệu hoặc sự không đồng bộ trong thông tin chat. Ngược lại, nếu chúng ta cần độ chính xác và tính toàn vẹn cao trong việc truyền tải dữ liệu, việc sử dụng TCP sẽ là lựa chọn phù hợp hơn.

Trên đây là hướng dẫn code tham khảo chương trình chat client server in java. Cảm ơn bạn đã tham khảo lập trình mạng trên ttnguyen.net.

Bài viết liên quan:

đổi tên file trong java

Lớp URL trong java

InetAddress trong java

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