https://github.com/xxrjun/socket-chatroom
🕸️ Real-time chatroom application leveraging Python sockets with encryption, GUI, and advanced server controls.
https://github.com/xxrjun/socket-chatroom
chatroom ncu socket
Last synced: 6 months ago
JSON representation
🕸️ Real-time chatroom application leveraging Python sockets with encryption, GUI, and advanced server controls.
- Host: GitHub
- URL: https://github.com/xxrjun/socket-chatroom
- Owner: xxrjun
- Created: 2024-12-11T16:54:18.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-12-13T08:17:30.000Z (about 1 year ago)
- Last Synced: 2025-04-01T11:53:44.489Z (10 months ago)
- Topics: chatroom, ncu, socket
- Language: Python
- Homepage:
- Size: 398 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Socket Programming Chatroom 🕸️

## Features
### Client
- [x] **使用者登入**:提供使用者建立唯一使用者名稱、登入並建立安全連線。
- [x] **即時訊息傳遞**:參與共享聊天室,即時交換訊息。
- [x] **線上成員顯示**:即時顯示線上成員列表。
- [x] **訊息時間戳**:每則訊息均附有精確的時間戳。
- [x] **自動重新連線**:支援當使用者意外斷線時,自動重新連線功能,無須重啟應用程式。
### Server Monitor
- [x] **連線總覽**:提供所有連線的即時資訊,包括連線狀態與持續時間(連線中、離線、重連中)。
- [x] **手動管理**:管理員可手動中斷特定使用者的連線。
- [x] **閒置超時處理**:自動中斷超過預設閒置時間的使用者連線,節省伺服器資源。
- [x] **廣播訊息**:支援伺服器端廣播訊息,傳遞給所有連線使用者。
- [x] **伺服器全面控制**:提供終止所有連線或關閉伺服器的選項。
- [x] **圖形介面**:提供直觀的圖形介面,用於監控與管理伺服器活動。
## Environment
### Setup
```bash
conda create -n sp-chat python=3.12
conda activate sp-chat
pip install -r requirements.txt
```
### Requirements
| Item | Version/Name |
| ---------- | ---------------------------------------------------------------------- |
| Python | 3.12 |
| GUI | [Tkinter](https://tkdocs.com/tutorial/index.html) |
| Encryption | [cryptography](https://cryptography.io/en/latest/) |
| Socket | [Python Socket](https://docs.python.org/zh-tw/3.12/howto/sockets.html) |
## Usage
### Config
You can modify the configuration in `config.py` or `.env` file. For `.env.example`, you can rename it to `.env` and modify the content.
```plaintext
# Network Configurations
CHAT_SERVER_HOST=0.0.0.0
CHAT_CLIENT_HOST=127.0.0.1
CHAT_TCP_PORT=5000
CHAT_UDP_PORT=5001
CHAT_BUFFER_SIZE=1024
CHAT_IDLE_TIMEOUT=60
# Client Configurations
CHAT_RECONNECT_DELAY=3
CHAT_MAX_RETRIES=3
# AES key and IV (Must match server and client)
CHAT_SECRET_KEY=this_is_a_32_byte_key_demo123456
CHAT_IV=0123456789ABCDEF
```
### Run Server
```bash
./scripts/run_server.sh
```
### Run Client
```bash
./scripts/run_client.sh
```
### Example (Single Server & 3 Clients)
```bash
python scripts/example.py
```
## Grading
### Implementation (90%)
Baseline (80%): Basic TCP or UDP application like sample codes (Single-Client Blocking Connection)
| Item | Description | Bonus | Checked | Explanation |
| ------------------------------------------ | ---------------------------------------------------------------- | ----- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Multi-client connections | 支援多用戶端連線。 | +10 | ✅ | |
| Multi-process or multi-thread | 使用多進程或多執行緒提升效能。 | +10 | ✅ | Server, GUI, Monitor, Client Connection, Presence Broadcast 等擁有各自的 Thread |
| GUI | 增加圖形使用者介面。 | +10 | ✅ | Server Monitor 以及 Chatroom 皆有 GUI |
| Message split | 處理超出 buffer 大小的訊息分割問題。 | +5 | ✅ | 使用兩個 `recv`,第一個用於確定長度,第二個用於取得訊息的資料部分。 |
| Use both UDP & TCP and Explain why | 同時使用 TCP 和 UDP,並解釋此設計的必要性及優勢。 | +5 | ✅ | **訊息傳遞**需要確保順序性以及穩定性,故使用 **TCP**。**廣播在線使用者**需要即時性,但就算有部分遺失也沒關係,下次廣播也會再次發送,故**使用 UDP**,節省伺服器資源並提高傳輸銷率。 |
| Message encryption & decryption | 實現訊息加密與解密,並解釋設計理念與加解密方式。 | +5 | ✅ | 為求簡單,僅使用 **Symmetric Encryption (AES-CBC + PKCS7 padding)**。實務上先使用 Asymmetric 做 Key Exchange,後續傳輸皆使用 Symmetric 會比較好,安全性與效率兼顧。 |
| Timeout handling | 設計機制處理閒置或未正常關閉的連線,避免資源耗盡。 | +5 | ✅ | 追蹤 Client 的 `last_active`,若超過 `IDLE_TIMEOUT` 便會中斷 Client 連線。 |
| Disconnection handling & Auto Reconnection | 如果用戶端斷線,自動重新連接,而非重新啟動用戶端。 | +5 | ✅ | 若 Client 並非因關閉而導致連線中斷,Client 會在 `MAX_RETRIES` 次數內自動嘗試重新連線。 |
| Multi-Port Listing | 為不同連線需求(如傳訊、廣播、影音串流等)提供不同的連接埠。 | +5 | ✅ | 傳訊使用 TCP (default= 5000)、廣播使用 UDP (default=5001) |
| Nonblocking and explain why | 實現非阻塞模式,並解釋如何避免多用戶或大量訊息時其他功能被阻塞。 | +5 | ✅ | 使用 Multi-threaded 來達到類似 Nonblocking 的效果。使用 `select` 會是比較正確的做法 |
| P2P | 挑戰實現基於 P2P 的分散式下載。 | +20 | | |
### Report (10%)
> 請參照 [llm_enhancement](./llm_enhancement)
**使用大型語言模型 (LLM) 提升程式碼品質**,如可讀性、結構優化、解耦合、可維護性、錯誤處理等),撰寫簡易報告,包含以下議題:
| Report Sections | Description | Checked |
| --------------------------------- | ---------------------------------------------------- | ------- |
| Prompt 的設計與使用的大型語言模型 | 說明 Prompt 的設計及所使用的 LLM。 | ✅ |
| 優化後的程式碼與原始程式碼的比較 | 比較優化後與原始程式碼,針對不同的優化方向進行探討。 | ✅ |
| LLM 的有效性與局限性 | 評估 LLM 的有效性與局限性。 | ✅ |
| LLM 在作業中其他應用方向 | 探討除了提升程式碼品質外,還可以如何應用 LLM。 | ✅ |
## Flowchart
### Client
```mermaid
flowchart TD
A[啟動應用] --> B[初始化GUI]
B --> C{是否有命令行參數?}
C -- 是 --> D[使用命令行提供的使用者名稱]
C -- 否 --> E[彈出對話框輸入使用者名稱]
D & E --> F[建立TCP連接]
F --> G{連接成功?}
G -- 是 --> H[啟動接收訊息執行緒]
G -- 否 --> I[嘗試重新連接]
H --> J[啟動監聽UDP執行緒]
I --> G
J --> K[等待使用者輸入並發送訊息]
K --> L[接收並顯示訊息]
L --> K
```
### Server
```mermaid
flowchart TD
A[啟動伺服器] --> B[初始化伺服器GUI]
B --> C[啟動主伺服器執行緒]
C --> D[監聽TCP連接]
D --> E[接收新客戶端連接]
E --> F[處理客戶端認證]
F --> G{驗證成功?}
G -- 是 --> H[加入客戶端列表]
G -- 否 --> I[拒絕連接]
H --> J[廣播用戶上線]
H --> K[啟動客戶端處理執行緒]
K --> L[接收並轉發訊息]
K --> M{客戶端斷線?}
M -- 是 --> N[移除客戶端並廣播離線]
D --> O[定時廣播在線用戶]
C --> P[監控閒置用戶]
P --> Q{用戶閒置超時?}
Q -- 是 --> R[斷線並通知用戶]
B --> S[處理管理員操作]
S --> T[廣播訊息/踢除用戶/關閉伺服器]
```