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

NetMsg 局域網聊天程式:TCP 多執行緒架構實現多點通訊與檔案傳輸

     編輯:關於VC++

專案背景

作者利用寒假 17 天,基於 TCP/IP Socket 多執行緒開發了一套類 QQ 的局域網即時通訊軟體,包含伺服端 NetMsgServer 與客戶端 NetMsgClient,支援多點文字聊天、點對點檔案傳輸、上線/下線即時感知。原始碼 3000+ 行,採用原生 send/recv 而非 CSocket 以追求效能。

整體通訊流程

通訊流程圖

伺服端 NetMsgServer 設計

  • 執行緒 1(Accept 執行緒):持續 accept() 客戶端連線請求
  • 執行緒 2(命令處理執行緒):每個客戶端連線成功後,建立專屬執行緒處理註冊、登入、下線、線上名單生成、用戶資料查詢/修改等命令

採用完成端口 (IOCP) 或執行緒池 可進一步擴展至千級併發,但本專案採簡單的一連線一執行緒模型,適合中小型區域網。

客戶端 NetMsgClient 多執行緒架構

每個客戶端同時扮演「訊息伺服端」與「訊息客戶端」角色,實現 P2P 多點通訊:

執行緒功能埠號
1登入伺服器(發送 USER/PASS)4000
2取得線上名單(LIST 指令)4000
3訊息伺服端 Accept 迴圈4001
4+每個聊天對象一條接收執行緒4001
N檔案傳輸伺服端/客戶端4002

關鍵資料結構


// 用戶資料
typedef struct {
    long id;
    char nickname[20];
    char sex[10];
    int age;
    char address[50];
    char password[20];
} USER_INF;

// 線上用戶
typedef struct {
    long id;
    char nickname[20];
    char ip[16];
    SOCKET s;
} ONLINEUSER_INF;

核心通訊協議(文字指令)


// 註冊
"REGT\t\n" + USER_INF 結構體
// 登入
"USER 1000\t\n"
"PASS password\t\n"
// 取得線上名單
"LIST\t\n"  -> 回傳 ONLINEUSER_INF 陣列
// 發起聊天
"chat 1001\t\n"  -> 對方收到後回覆 ACCEPT_CHAT_REQ / REJECT_CHAT_REQ
// 檔案傳輸
"File xxx.avi\t\n"  -> 對方連接檔案埠 4002 開始傳輸

關鍵程式碼片段

訊息伺服端 Accept 迴圈


while (TRUE) {
    int sockLen = sizeof(inetAddr);
    SOCKET sAccept = accept(sListen, (SOCKADDR*)&inetAddr, &sockLen);
    if (sAccept == INVALID_SOCKET) { /* 錯誤處理 */ }
    AfxBeginThread(ThreadRecvMsgServer, (LPVOID)sAccept);
}

聊天請求處理


// 接收到 "chat 1001\t\n"
if (目前聊天人數過多) {
    send(acceptSocket, "REJECT_CHAT_REQ\t\n", ...);
} else {
    send(acceptSocket, "ACCEPT_CHAT_REQ\t\n", ...);
    // 建立雙向通訊迴圈
}

已知限制與改進方向

  • 介面較簡陋(作者自述「界面編程一竅不通」)
  • 僅支援區域網,無 NAT 穿透 / Proxy 支援
  • 無加密傳輸,資料明文
  • 執行緒管理可改用 IOCP / 線程池 提升擴展性
  • 協議為自定義文字格式,建議改用 Protocol Buffers / JSON 序列化

總結

NetMsg 完整展示了「客戶端同時作為伺服端」的 P2P 多點通訊架構,對理解即時通訊核心流程、多執行緒 Socket 程式設計極具參考價值。完整原始碼請參考本文配套下載。

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