參考袁淵先生《基於 TCP/IP 的區域網路多使用者通訊》一文,作者重新設計了一套更完整的系統:採用三獨立程式模組 (註冊/登入伺服器、聊天轉發伺服器、客戶端),解決原文主執行緒阻塞、死結風險、無檔案傳輸、網路設定硬編碼等問題。
| 模組 | 執行檔 | 職責 |
|---|---|---|
| 註冊/登入伺服器 | wbQQRegSer | 使用者註冊、登入驗證、Access 資料庫管理、啟動聊天伺服器進程 |
| 聊天通訊伺服器 | wbQQChat | 無介面進程、共享記憶體結構、每客戶端雙執行緒 (收/發)、訊息轉發、上下線管理 |
| 客戶端 | wbQQClient | 註冊嚮導、登入、聊天視窗 (好友清單、記錄、托盤提示)、檔案傳輸 (半雙工、P2P 模式) |
WSAStartup → socket → bind → listen。RegLoad 執行緒 accept 迴圈,每新連線建立 talkToClient 執行緒處理註冊/登入邏輯 (讀寫資料庫),處理完關閉執行緒與 Socket。CreateProcess 啟動聊天伺服器,TerminateProcess 關閉。socketInfo 儲存每客戶端:Socket、用戶名、接收/發送執行緒控制碼、事件物件。RecvData:recv 迴圈,解析封包頭 (接收者用戶名),查找鏈結串列轉發。SendData:等待發送事件,從佇列取出資料 send。Close!,伺服器移除鏈結串列節點。SendFile! 彈出確認視窗,同意則建立連線傳輸,拒絕回 Refuse!。傳輸完成自動關閉對話框。| 方向 | 封包格式 | 說明 |
|---|---|---|
| 客戶→註冊伺服器 | Reg:用戶名:年齡:性別:密碼:真實姓名:城市:Email:電話 | 註冊資料 |
| 客戶→註冊伺服器 | Load:用戶名:密碼 | 登入驗證 |
| 註冊伺服器→客戶 | success! / exist! / Error! | 註冊/登入結果 |
| 客戶→聊天伺服器 | 用戶名 (上線註冊) | 建立 socketInfo 節點 |
| 客戶→聊天伺服器 | 接收者:發送者頭像ID~時間\t發送者->接收者\n訊息內容 | 聊天訊息,伺服器依接收者轉發 |
| 客戶→聊天伺服器 | Close! | 下線移除節點 |
| 客戶→客戶 (P2P) | SendFile! / Refuse! | 檔案傳輸協商 |
wbQQuser,類型 Access,檔案 wbQQuser.mdb本系統展示了完整的區域網路即時通訊架構:分離註冊與聊天伺服器降低耦合、雙執行緒模型確保轉發效能、P2P 檔案傳輸避免伺服器頻寬壓力、自訂協定簡潔易擴充。原始碼註解詳盡,適合作為 IM 系統二次開發基礎。