Một ứng dụng chat thời gian thực client-server, viết bằng Java thuần + Swing UI, tích hợp mã hóa RSA + AES để đảm bảo bảo mật đầu cuối (End-to-End). Giao diện xịn sò, bong bóng tin nhắn như Messenger.
Client (Swing UI) <--> TCP Socket <--> Server (Java)
- Giao thức custom:
CMD (byte)+size (int)+payload (byte[]) - Dùng VirtualThread (JDK 19+) cho mọi tác vụ IO → scale ngàn kết nối vẫn mượt
- Tin nhắn được wrap bằng
MessageWritervà đọc lại bằngMessageReader - Hệ thống mã hóa:
- 🔐 Dùng RSA để trao đổi key AES
- 🔒 Dùng AES để mã hóa nội dung chat
- Toàn bộ hệ thống được tách rõ các tầng: UI - Logic - Network - Security
- UI chính:
MainFramedùng CardLayoutHomePanel: Đăng nhậpChatPanel: Giao diện chat full tính năng
- Bong bóng chat:
MessageBubblePanel- Align trái/phải theo người gửi
- Scroll tự động xuống dòng mới
- Java 19+
- Gradle (hoặc dùng
./gradlew)
Chạy Server
cd Server
../gradlew runChạy Client
cd Client
../gradlew runMặc định kết nối tới
localhost:15555.
- Mỗi client khởi tạo:
- 1 cặp khóa RSA
- 1 khóa AES tạm
- Khi đăng nhập:
- Gửi
Tên+PublicKeyRSAlên server
- Gửi
- Khi gửi tin nhắn:
- Mã hóa nội dung bằng AES
- Mã hóa AES key bằng PublicKeyRSA của người nhận
- Người nhận:
- Dùng PrivateKeyRSA để giải mã key AES
- Giải mã nội dung bằng AES key
✅ Không server nào đọc được nội dung thật sự. Đây là "privacy by design".
| Tầng | Class | Vai trò |
|---|---|---|
| UI | MainFrame, HomePanel, ChatPanel |
Giao diện chính |
| Logic | ServerRequestManager |
Gửi lệnh tới server |
| Logic | ControllerMessage |
Nhận và xử lý lệnh từ server |
| Network | Session |
Đọc/ghi socket TCP |
| Network | MessageWriter, MessageReader |
Giao thức |
| Security | AESUtil, RSAUtil |
Mã hóa dữ liệu |
| Data | DataChat, MemChat |
Quản lý bộ nhớ và danh sách online |
Main.java → MainFrame.Instance.setVisible(true)ServerRequestManager.connect(name)
→ tạo RSA keypair + AES key
→ tạo Session (socket)
→ gửi CMD.LOGIN gồm tên và publicKey RSAServer gửi danh sách name + pubKeyRSA → lưu vào DataChat
ServerRequestManager.sendChatMessage(curMemChat, text)
→ AES.encrypt(text)
→ RSA.encrypt(aesKey)
→ Gửi CMD.SEND_CHAT_MESSAGE(receiver, encryptedText, encryptedAESKey)ControllerMessage → CMD.RECEIVE_CHAT_MESSAGE
→ RSA.decrypt(aesKey)
→ AES.decrypt(text)
→ hiển thị bong bóng
→ lưu vào DataChatClientUser → ClientApp : Nhập tên
ClientApp → Server : CMD.LOGIN (tên, publicKeyRSA)
Server → ClientApp : CMD.LOGIN (OK + danh sách online)
Client → Server : CMD.SEND_CHAT_MESSAGE (receiver, AES(text), RSA(aesKey))
Server → Receiver : CMD.RECEIVE_CHAT_MESSAGE (sender, AES(text), RSA(aesKey))
Receiver → ClientUI : Giải mã và hiển thị
| Cần hiểu | Đọc file nào |
|---|---|
| UI hoạt động ra sao? | MainFrame.java, ChatPanel.java |
| Logic gửi message | ServerRequestManager.java |
| Nhận message | ControllerMessage.java |
| Mã hóa RSA + AES | RSAUtil.java, AESUtil.java |
| TCP xử lý thế nào | Session.java, MessageWriter/Reader.java |
- ✅ Không dùng framework → nhanh, nhẹ, dễ debug
- ✅ Mã hóa End-to-End → bảo mật cực cao
- ✅ VirtualThread toàn tập → IO không block, đa luồng cực nhẹ
- ✅ Giao diện đẹp, dễ dùng, align trái/phải chuẩn như Telegram
- Gửi file đính kèm
- Thêm trạng thái "đang gõ..."
- Lưu tin nhắn vào DB / file
- Push notification khi app minimize
- ✍️ Code by KhanhDz
- ❤️ Mọi đóng góp đều được hoan nghênh
🔥 Ghi nhớ:
Cốt lõi hệ thống:
CMD → MessageWriter → Session → TCP ↘ ↗ AES/RSA → an toàn cực mạnh
Nếu bạn hiểu được flow này, bạn làm được bất kỳ feature nào.