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

基於 TCP/IP 的局域網多用戶通信系統設計(四):多線程通信機制與客戶端設計

     編輯:VC++

3.2 通信服務器(續):多線程模型深度解析

雙線程架構

每個用戶連接成功後,服務器創建兩個緊密協作的線程:

  • 接收線程:創建後處於可執行狀態,循環調用 recv 監聽數據。
  • 發送線程:創建後即掛起(SuspendThread),等待接收線程喚醒發送數據。

兩線程同生共死:任一方異常或連接關閉,雙雙退出。雖簡化了邏輯,但每連接佔用兩線程,限制了最大併發數,需根據硬體資源評估。

線程同步與互斥

因多線程共同操作 info_data,引入互斥量 CMutex m_mutex 保護臨界區:

// 接收線程片段
UINT RecvData(void* cs) {
    SOCKET clientSocket = (SOCKET)cs;
    while(1) {
        numrcv = recv(clientSocket, buffer, MAXBUFLEN, 0);
        buffer[numrcv] = '\0';
        if(strcmp(buffer, "Close!") != 0) { // 普通訊息
            // 遍歷 s_info 查找目標用戶
            for(i=0; i<COUNT; i++) {
                if(po != NULL) {
                    s1 = s_info.GetNext(po);
                    if(s1.pet.Compare(petname) == 0) {
                        m_mutex.Lock();
                        info_data.data = pos;
                        info_data.thread = s1.thread;
                        m_mutex.Unlock();
                        s1.thread->ResumeThread(); // 喚醒發送線程
                        break;
                    }
                }
            }
        } else { // 用戶下線
            // ... 類似加鎖操作,並從 s_info 移除用戶
        }
    }
    closesocketlink((LPVOID)clientSocket);
    AfxEndThread(0, true);
    return 1;
}

// 發送線程片段
UINT SendData(void* cs) {
    SOCKET clientSocket = (SOCKET)cs;
    while(1) {
        if(info_data.data != "Close!") {
            m_mutex.Lock();
            numsnd = send(clientSocket, info_data.data, info_data.data.GetLength(), 0);
            now = info_data.thread;
            m_mutex.Unlock();
            now->SuspendThread(); // 發送完自我掛起
        } else { goto bb; }
    }
    bb: closesocketlink((LPVOID)clientSocket);
    AfxEndThread(0, true);
    return 1;
}

3.3 客戶端設計考量

客戶端雖無需處理複雜的多線程邏輯,但作為面向終端用戶的產品,體驗至上:

  • 協議兼容性:嚴格遵循服務器定義的通信協議格式。
  • 交互友好:直觀的 UI、快捷鍵支持、托盤圖標閃爍、聲音提醒等。
  • 數據可靠:確保訊息收發無丟失、無亂序。
  • 記錄管理:完整的聊天記錄存儲、查詢、導出功能。

架構上劃分三個獨立對話框:註冊、登錄、主通信界面。註冊/登錄對接端口 56789,通信對接端口 56790,物理隔離了驗證與業務流量,兼顧安全與性能。

結語與項目驗證

本系統已在實驗室局域網環境(1 台服務器,20 台客戶機)穩定運行。通過多線程與共享數據結構技術,實現了高效的局域網多用戶即時通訊,為基於 TCP/IP 的網絡應用開發提供了可參考的工程實踐。

參考文獻
[1] Eugene Olafsen 等. MFC Visual C++ 6.0 編程技術內幕. 機械工業出版社, 2000.
[2] Charles Wright. Visual C++ 程序員實用大全. 中國水利水電出版社, 2001.

作者:袁 淵(華東船舶工業學院 機械系,江蘇 鎮江 212003)

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