日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
描述C#異步Socket

幾天前在博問中看到一個(gè)C#異步Socket問題,就想到筆者2004年做的一個(gè)省級交通流量接收服務(wù)器項(xiàng)目,當(dāng)時(shí)的基本求如下:

接收自動(dòng)觀測設(shè)備通過無線網(wǎng)卡、Internet和Socket上報(bào)的交通量數(shù)據(jù)包 全年365*24運(yùn)行的自動(dòng)觀測設(shè)備5分鐘上報(bào)一次觀測數(shù)據(jù),每筆記錄約2K大小 規(guī)劃全省將有100個(gè)左右的自動(dòng)觀測設(shè)備(截止2008年10月還只有30個(gè))
當(dāng)時(shí),VS2003才發(fā)布年多,筆者也是接觸C#不久。于是Google了國內(nèi)國外網(wǎng),希望找點(diǎn)應(yīng)用C#解決Socket通信問題的思路和代碼。***,找到了兩篇幫助***的文章:一篇是國人寫的Socket接收器框架,應(yīng)用了獨(dú)立的客戶端Socket會(huì)話(Session)概念,給筆者提供了一個(gè)接收服務(wù)器的總體框架思路;另一篇是美國人寫的,提出了多線程、分段接收數(shù)據(jù)包的技術(shù)方案,描述了多線程、C#異步Socket的許多實(shí)現(xiàn)細(xì)節(jié),該文堅(jiān)定了筆者采用多線程和處理異步Socket接收器的技術(shù)路線。

具體實(shí)現(xiàn)和測試時(shí)筆者還發(fā)現(xiàn),在Internet環(huán)境下的Socket應(yīng)用中,需要系統(tǒng)有極強(qiáng)的容錯(cuò)能力:沒有辦法控制異常,就必須允許它們存在(附加源代碼中可以看到,try{}catch{}語句較多)。對此,筆者設(shè)計(jì)了一個(gè)專門的檢查和清理線程,完成無效或超時(shí)會(huì)話的清除和資源釋放工作。

依稀記得,國內(nèi)框架作者的名稱空間有ibm,認(rèn)為是IBM公司職員,通過郵件后才知道其人在深圳。筆者向他請教了幾個(gè)問題,相互探討了幾個(gè)技術(shù)關(guān)鍵點(diǎn)。可惜,現(xiàn)在再去找,已經(jīng)查不到原文和郵件了。只好借此機(jī)會(huì),將本文獻(xiàn)給這兩個(gè)素未謀面的技術(shù)高人和同行,也盼望拙文或源碼能給讀者一點(diǎn)有用的啟發(fā)和幫助。

1、主要技術(shù)思路

整個(gè)系統(tǒng)由三個(gè)核心線程組成,并由.NET線程池統(tǒng)一管理:

偵聽客戶端連接請求線程:ListenClientRequest(),循環(huán)偵聽客戶端連接請求。如果有,檢測該客戶端IP,看是否是同一觀測設(shè)備,然后建立一個(gè)客戶端TSession對象,并通過異步Socket調(diào)用方法BeginReceive()接收數(shù)據(jù)包、EndReceive()處理數(shù)據(jù)包 數(shù)據(jù)包處理線程:HandleDatagrams(),循環(huán)檢測數(shù)據(jù)包隊(duì)列_datagramQueue,完成數(shù)據(jù)包解析、判斷類型、存儲(chǔ)等工作 客戶端狀態(tài)檢測線程:CheckClientState(),循環(huán)檢查客戶端會(huì)話表_sessionTable,判斷會(huì)話對象是否有效,設(shè)置超時(shí)會(huì)話關(guān)閉標(biāo)志,清楚無效會(huì)話對象及釋放其資源。

2、主要類簡介

系統(tǒng)主要由3個(gè)類組成:

TDatagramReceiver(數(shù)據(jù)包接收服務(wù)器):系統(tǒng)的核心進(jìn)程類,建立Socket連接、處理與存儲(chǔ)數(shù)據(jù)包、清理系統(tǒng)資源,該類提供全部的public屬性和方法 TSession(客戶端會(huì)話):由每個(gè)客戶端的Socket對象組成,有自己的數(shù)據(jù)緩沖區(qū),清理線程根據(jù)該對象的最近會(huì)話時(shí)間判斷是否超時(shí) TDatagram(數(shù)據(jù)包類):判斷數(shù)據(jù)包類別、解析數(shù)據(jù)包

3、關(guān)鍵函數(shù)和代碼

下面簡介核心類TDatagramReceiver的關(guān)鍵實(shí)現(xiàn)代碼。系統(tǒng)啟動(dòng)

系統(tǒng)啟動(dòng)方法StartReceiver()首先清理資源、創(chuàng)建數(shù)據(jù)庫連接、初始化若干計(jì)數(shù)值,然后創(chuàng)建服務(wù)器端偵聽Socket對象,***調(diào)用靜態(tài)方法ThreadPool.QueueUserWorkItem()在線程池中創(chuàng)建3個(gè)核心處理線程。以上介紹C#異步Socket

 
 
 
  1. Code
  2. ///
  3. ///啟動(dòng)接收器
  4. ///
  5. publicboolStartReceiver()
  6. {
  7. try
  8. {
  9. _stopReceiver=true;
  10. this.Close();
  11. if(!this.ConnectDatabase())returnfalse;
  12. _clientCount=0;
  13. _datagramQueueCount=0;
  14. _datagramCount=0;
  15. _errorDatagramCount=0;
  16. _exceptionCount=0;
  17. _sessionTable=newHashtable(_maxAllowClientCount);
  18. _datagramQueue=newQueue(_maxAllowDat)

當(dāng)前名稱:描述C#異步Socket
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/dpidjji.html