首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

區域網路多使用者聊天與檔案傳輸系統:TCP 架構、三層伺服器設計與通訊協定完整解析

     編輯:關於VC++

前言

參考袁淵先生《基於 TCP/IP 的區域網路多使用者通訊》一文,作者重新設計了一套更完整的系統:採用三獨立程式模組 (註冊/登入伺服器、聊天轉發伺服器、客戶端),解決原文主執行緒阻塞、死結風險、無檔案傳輸、網路設定硬編碼等問題。

系統架構

模組執行檔職責
註冊/登入伺服器wbQQRegSer使用者註冊、登入驗證、Access 資料庫管理、啟動聊天伺服器進程
聊天通訊伺服器wbQQChat無介面進程、共享記憶體結構、每客戶端雙執行緒 (收/發)、訊息轉發、上下線管理
客戶端wbQQClient註冊嚮導、登入、聊天視窗 (好友清單、記錄、托盤提示)、檔案傳輸 (半雙工、P2P 模式)

關鍵技術細節

1. 註冊/登入伺服器 - 並發模型

  • WSAStartup → socket → bind → listen。
  • 主執行緒建立 RegLoad 執行緒 accept 迴圈,每新連線建立 talkToClient 執行緒處理註冊/登入邏輯 (讀寫資料庫),處理完關閉執行緒與 Socket。
  • 用 CreateProcess 啟動聊天伺服器,TerminateProcess 關閉。

2. 聊天伺服器 - 無介面 + 共享結構 + 雙執行緒

  • 建立 SDI 專案後刪除對話框類別與相關程式碼,成為無介面應用程式。
  • 全域鏈結串列 socketInfo 儲存每客戶端:Socket、用戶名、接收/發送執行緒控制碼、事件物件。
  • 每客戶端建立兩個執行緒:
    • RecvData:recv 迴圈,解析封包頭 (接收者用戶名),查找鏈結串列轉發。
    • SendData:等待發送事件,從佇列取出資料 send。
  • 客戶端離線送出 Close!,伺服器移除鏈結串列節點。

3. 客戶端 - 四大模組

  • 註冊嚮導:三步驟 (基本資料/詳細資料/網路設定),支援兩伺服器分離部署。
  • 登入:驗證成功後連接聊天伺服器,送出用戶名註冊上線。
  • 聊天:下拉選單選好友,發送訊息同時寫入記錄檔;收到訊息閃爍托盤圖示提示。
  • 檔案傳輸:P2P 半雙工。發送方彈出對話框等待接收方確認;接收方收到 SendFile! 彈出確認視窗,同意則建立連線傳輸,拒絕回 Refuse!。傳輸完成自動關閉對話框。

通訊協定設計

方向封包格式說明
客戶→註冊伺服器Reg:用戶名:年齡:性別:密碼:真實姓名:城市:Email:電話註冊資料
客戶→註冊伺服器Load:用戶名:密碼登入驗證
註冊伺服器→客戶success! / exist! / Error!註冊/登入結果
客戶→聊天伺服器用戶名 (上線註冊)建立 socketInfo 節點
客戶→聊天伺服器接收者:發送者頭像ID~時間\t發送者->接收者\n訊息內容聊天訊息,伺服器依接收者轉發
客戶→聊天伺服器Close!下線移除節點
客戶→客戶 (P2P)SendFile! / Refuse!檔案傳輸協商

已知問題與改進方向

  • 全域變數過多導致耦合度高,建議封裝為管理類別。
  • 部分函數過長,應拆分為單一職責函數。
  • 檔案傳輸按鈕狀態控制 (傳輸中禁用) 目前靠全域旗標,建議改用執行緒同步事件或狀態機。
  • 資料庫採用 Access (ODBC),大量併發建議升級 SQL Server/MySQL。

建置需求

  • 環境:Win2000 SP4 + VC6 MFC
  • ODBC 資料源:名稱 wbQQuser,類型 Access,檔案 wbQQuser.mdb

總結

本系統展示了完整的區域網路即時通訊架構:分離註冊與聊天伺服器降低耦合、雙執行緒模型確保轉發效能、P2P 檔案傳輸避免伺服器頻寬壓力、自訂協定簡潔易擴充。原始碼註解詳盡,適合作為 IM 系統二次開發基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved