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)

1.2 Code file chat Server
ObjectOutputStream objOut;
model = new DefaultListModel();
model.addElement("Server dang doi ket noi...");
//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);
//Khoi tao ObjectInputStream va ObjOutputStream
objIn = new ObjectInputStream(socket.getInputStream());
objOut = new ObjectOutputStream(socket.getOutputStream());
new Thread(new Runnable() {
public void ReceiveMsg() {
//Doc chuoi tin nhan tu ObjInputStream
String receiveMsg = (String) objIn.readObject();
model.addElement("Client: " + receiveMsg);
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();
}
}
}
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) {
String message = txtMsg.getText();
//Gui tin nhan den Server thong qua objOutputStream
objOut.writeObject(message);
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();
}
}
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
ObjectOutputStream objOut;
model = new DefaultListModel();
//Tao Socket ket noi den may chu
Socket socket = new Socket(ip, port);
model.addElement("Connected to " + socket);
//Khoi tao ObjectInputStream va ObjOutputStream
objOut = new ObjectOutputStream(socket.getOutputStream());
objIn = new ObjectInputStream(socket.getInputStream());
new Thread(new Runnable() {
public void ReceiveMsg() {
//Doc chuoi tin nhan tu ObjInputStream
String receiveMsg = (String) objIn.readObject();
model.addElement("Server: " + receiveMsg);
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();
}
}
}
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) {
String message = txtMsg.getText();
//Gui tin nhan den Server thong qua objOutputStream
objOut.writeObject(message);
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();
}
}
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)

2.2 Code File Chat Server
public final static byte[] BUFFER = new byte[4069];
DatagramSocket ds = null;
public static int SERVER_PORT = 7;
model = new DefaultListModel();
ds = new DatagramSocket(SERVER_PORT);
model.addElement("Server Started !");
new Thread(new Runnable() {
private InetAddress clientAddress;
private void ReceiveMsg() {
DatagramPacket incoming = new DatagramPacket(BUFFER, BUFFER.length);
clientAddress = incoming.getAddress();
clientPort = incoming.getPort();
String mess = new String(incoming.getData(), 0, incoming.getLength());
model.addElement("Client: " + mess);
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();
}
}
}
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) {
String mess = txtMsg.getText();
byte[] sendData = mess.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
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();
}
}
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
DatagramSocket ds = null;
public static String SERVER_IP = "localhost";
public static int SERVER_PORT = 7;
public final static byte[] BUFFER = new byte[4069];
model = new DefaultListModel();
ds = new DatagramSocket();
model.addElement("Client Started !");
lsChat_client.setModel(model);
new Thread(new Runnable() {
private void ReceiveMsg() {
DatagramPacket incoming = new DatagramPacket(BUFFER, BUFFER.length);
String mess = new String(incoming.getData(), 0, incoming.getLength());
model.addElement("Server: " + mess);
lsChat_client.setModel(model);
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();
}
}
}
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) {
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);
txtMsg_client.setText("");
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();
}
}
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