StartReceiver() 方法是整個接收器的入口點,負責完成資源清理、資料庫連接、計數器初始化、Socket 建立以及核心線程的啟動。整個流程採用線程池管理三大核心工作線程,確保高併發下的穩定運行。
_sessionTable(Hashtable)與數據包隊列 _datagramQueue(Queue<TDatagram>),容量由配置常數決定。CreateReceiverSocket() 建立伺服器端 Socket,綁定端口並進入偵聽狀態。ListenClientRequest:持續偵聽客戶端連接請求,驗證 IP 並建立 TSession 對象,隨即啟動異步接收(BeginReceive/EndReceive)。HandleDatagrams:循環處理數據包隊列,完成解析、分類、存儲等業務邏輯。CheckClientState:定期掃描會話表,清理超時或無效會話並釋放資源。_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 保障長時間運行穩定性。