- 使用者登入:提供使用者建立唯一使用者名稱、登入並建立安全連線。
- 即時訊息傳遞:參與共享聊天室,即時交換訊息。
- 線上成員顯示:即時顯示線上成員列表。
- 訊息時間戳:每則訊息均附有精確的時間戳。
- 自動重新連線:支援當使用者意外斷線時,自動重新連線功能,無須重啟應用程式。
- 連線總覽:提供所有連線的即時資訊,包括連線狀態與持續時間(連線中、離線、重連中)。
- 手動管理:管理員可手動中斷特定使用者的連線。
- 閒置超時處理:自動中斷超過預設閒置時間的使用者連線,節省伺服器資源。
- 廣播訊息:支援伺服器端廣播訊息,傳遞給所有連線使用者。
- 伺服器全面控制:提供終止所有連線或關閉伺服器的選項。
- 圖形介面:提供直觀的圖形介面,用於監控與管理伺服器活動。
conda create -n sp-chat python=3.12
conda activate sp-chat
pip install -r requirements.txt| Item | Version/Name |
|---|---|
| Python | 3.12 |
| GUI | Tkinter |
| Encryption | cryptography |
| Socket | Python Socket |
You can modify the configuration in config.py or .env file. For .env.example, you can rename it to .env and modify the content.
# 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
./scripts/run_server.sh./scripts/run_client.shpython scripts/example.pyBaseline (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 |
請參照 llm_enhancement
使用大型語言模型 (LLM) 提升程式碼品質,如可讀性、結構優化、解耦合、可維護性、錯誤處理等),撰寫簡易報告,包含以下議題:
| Report Sections | Description | Checked |
|---|---|---|
| Prompt 的設計與使用的大型語言模型 | 說明 Prompt 的設計及所使用的 LLM。 | ✅ |
| 優化後的程式碼與原始程式碼的比較 | 比較優化後與原始程式碼,針對不同的優化方向進行探討。 | ✅ |
| LLM 的有效性與局限性 | 評估 LLM 的有效性與局限性。 | ✅ |
| LLM 在作業中其他應用方向 | 探討除了提升程式碼品質外,還可以如何應用 LLM。 | ✅ |
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
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[廣播訊息/踢除用戶/關閉伺服器]