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

C# 多線程異步 Socket 數據包接收器框架(二):系統啟動與核心線程啟動流程

     編輯:關於C語言

系統啟動核心邏輯

StartReceiver() 方法是整個接收器的入口點,負責完成資源清理、資料庫連接、計數器初始化、Socket 建立以及核心線程的啟動。整個流程採用線程池管理三大核心工作線程,確保高併發下的穩定運行。

啟動步驟詳解

  1. 資源清理與初始化:設置停止標誌、關閉現有連接、建立資料庫連接,並將各類計數器(客戶端數、數據包隊列數、總包數、錯誤包數、異常數)歸零。
  2. 核心集合建立:初始化會話表 _sessionTable(Hashtable)與數據包隊列 _datagramQueue(Queue<TDatagram>),容量由配置常數決定。
  3. Socket 偵聽對象創建:調用 CreateReceiverSocket() 建立伺服器端 Socket,綁定端口並進入偵聽狀態。
  4. 三大核心線程入隊線程池:
    • ListenClientRequest:持續偵聽客戶端連接請求,驗證 IP 並建立 TSession 對象,隨即啟動異步接收(BeginReceive/EndReceive)。
    • HandleDatagrams:循環處理數據包隊列,完成解析、分類、存儲等業務邏輯。
    • CheckClientState:定期掃描會話表,清理超時或無效會話並釋放資源。
  5. 啟用連接請求:將 _stopConnectRequest 設為 false,正式開放客戶端連接。

關鍵代碼片段

/// <summary>
/// 啟動接收器
/// </summary>
public bool StartReceiver()
{
    try
    {
        _stopReceiver = true;
        this.Close();
        if (!this.ConnectDatabase()) return false;
        _clientCount = 0;
        _datagramQueueCount = 0;
        _datagramCount = 0;
        _errorDatagramCount = 0;
        _exceptionCount = 0;
        _sessionTable = new Hashtable(_maxAllowClientCount);
        _datagramQueue = new Queue<TDatagram>(_maxAllowDatagramQueueCount);
        _stopReceiver = false; // 循環中均需檢查該標誌
        if (!this.CreateReceiverSocket()) // 建立伺服器端 Socket 對象
        {
            return false;
        }
        // 偵聽客戶端連接請求線程,使用委托推斷,不建 CallBack 對象
        if (!ThreadPool.QueueUserWorkItem(ListenClientRequest))
        {
            return false;
        }
        // 處理數據包隊列線程
        if (!ThreadPool.QueueUserWorkItem(HandleDatagrams))
        {
            return false;
        }
        // 檢查客戶會話狀態,長時間未通信則清除該對象
        if (!ThreadPool.QueueUserWorkItem(CheckClientState))
        {
            return false;
        }
        _stopConnectRequest = false; // 啟動接收器,則自動允許連接
    }
    catch
    {
        this.OnReceiverException();
        _stopReceiver = true;
    }
    return !_stopReceiver;
}

設計亮點

  • 線程池統一管理:避免手動創建線程開銷,提升擴展性。
  • 異步非阻塞模型:BeginReceive/EndReceive 配合會話緩衝區,實現高吞吐量數據接收。
  • 容錯與自愈:專門的檢查線程定期清理殘留會話,配合大量 try-catch 保障長時間運行穩定性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved