新聞中心
雖然在APP應(yīng)用、Web應(yīng)用、Winform應(yīng)用等大趨勢(shì)下,越來越多的企業(yè)趨向于這些應(yīng)用系統(tǒng)開發(fā),但是Socket的應(yīng)用在某些場(chǎng)合是很必要 的,如一些停車場(chǎng)終端設(shè)備的接入,農(nóng)業(yè)或者水利、壓力監(jiān)測(cè)方面的設(shè)備數(shù)據(jù)采集等,以及常見的IM(即時(shí)通訊,如騰訊QQ、阿里旺旺等)的客戶端,都可以采 用Socket框架進(jìn)行相關(guān)的數(shù)據(jù)采集和信息通訊用途的,Socket應(yīng)用可以做為APP應(yīng)用、Web應(yīng)用和Winform應(yīng)用的補(bǔ)充。

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、肇州網(wǎng)絡(luò)推廣、成都微信小程序、肇州網(wǎng)絡(luò)營(yíng)銷、肇州企業(yè)策劃、肇州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供肇州建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
1、Socket應(yīng)用場(chǎng)景
一般情況下,客戶端和服務(wù)端進(jìn)行Socket連接,需要進(jìn)行數(shù)據(jù)的交換,也就是后臺(tái)提供數(shù)據(jù)查詢或者寫入的相關(guān)操作,它們的應(yīng)用場(chǎng)景也是在后臺(tái)有一個(gè)應(yīng)用數(shù)據(jù)庫(kù)支持的,如下所示。
Socket服務(wù)器和客戶端的通訊原理如下所示,客戶端通過服務(wù)器地址和端口發(fā)起Socket連接,服務(wù)器在接收到Socket客戶端的請(qǐng)求后,開辟一個(gè)新的Socket連接進(jìn)行通訊管理,兩方基于Socket協(xié)議進(jìn)行數(shù)據(jù)的交互處理。
2、Socket框架設(shè)計(jì)思路
Socket開發(fā)是屬于通信底層的開發(fā),.NET本身也提供了非常豐富的類來實(shí)現(xiàn)Socket的開發(fā)工作,Socket框架應(yīng)針對(duì)這些基礎(chǔ)功能進(jìn)行了很好的封裝處理,已達(dá)到統(tǒng)一、高效的使用。
要掌握或者了解Socket開發(fā),必須了解下面所述的場(chǎng)景及知識(shí)。
-
TCP客戶端,連接服務(wù)器端,進(jìn)行數(shù)據(jù)通信
-
TCP服務(wù)器端,負(fù)責(zé)偵聽客戶端連接
-
連接客戶端的管理,如登陸,注銷等,使用獨(dú)立線程處理
-
數(shù)據(jù)接收管理,負(fù)責(zé)數(shù)據(jù)的接受,并處理隊(duì)列的分發(fā),使用獨(dú)立線程處理,簡(jiǎn)單處理后叫給“數(shù)據(jù)處理線程”
-
數(shù)據(jù)處理線程,對(duì)特定的數(shù)據(jù),采用獨(dú)立的線程進(jìn)行數(shù)據(jù)處理
-
數(shù)據(jù)的封包和解包,按照一定的協(xié)議進(jìn)行數(shù)據(jù)的封裝和解包
針對(duì)以上內(nèi)容,可以封裝以下功能的操作類作為共用基類:
-
BaseSocketClient,客戶端基類,負(fù)責(zé)客戶端的鏈接、斷開、發(fā)送、接收等操作。
-
BaseSocketServer,TCP服務(wù)器管理基類,負(fù)責(zé)在獨(dú)立的線程中偵聽指定的端口,如果有客戶端連接進(jìn)來,則進(jìn)行相應(yīng)的處理。
-
BaseClientManager,連接客戶端管理類,該類主要負(fù)責(zé)客戶端登錄超時(shí)處理,連接上來的客戶端維護(hù),經(jīng)過登陸驗(yàn)證的客戶端維護(hù),客戶端登陸驗(yàn)證接口,客戶端發(fā)送數(shù)據(jù)處理等功能。
-
BaseReceiver,數(shù)據(jù)接收處理類,該基類是所有接受數(shù)據(jù)的處理類,負(fù)責(zé)維護(hù)數(shù)據(jù)的隊(duì)列關(guān)系,并進(jìn)一步進(jìn)行處理。
-
ThreadHandler,數(shù)據(jù)獨(dú)立線程處理類,對(duì)每個(gè)不同類型的數(shù)據(jù)(不同的協(xié)議類型),可以用獨(dú)立的線程進(jìn)行處理,這里封裝了一個(gè)基類,用于進(jìn)行數(shù)據(jù)獨(dú)立線程的處理。
1)Socket客戶端基類
我們知道Socket通訊,分為了客戶端和服務(wù)端,它們各自處理的事情是有所不同的,因此為了實(shí)現(xiàn)更好的代碼重用,我們?cè)谶@個(gè)基礎(chǔ)上進(jìn)行了不同的封 裝。針對(duì)Socket客戶端類,我們主要需要提供基礎(chǔ)的Socket連接及斷開、接收及發(fā)送、封包拆包等常規(guī)操作過程,因此我們封裝了一個(gè)客戶端基類 BaseSocketClient。
但是為了基于不同的應(yīng)用客戶端,實(shí)現(xiàn)不同的業(yè)務(wù)溝通,我們可以在服務(wù)端接收處理不同的客戶端,因此也就是需要對(duì)Socket客戶端進(jìn)行派生擴(kuò)展,例如本框架增加了一個(gè)中心的Socket客戶端、分店的Socket客戶端、還有一個(gè)橋接的連接客戶端(可實(shí)現(xiàn)轉(zhuǎn)發(fā)數(shù)據(jù)功能)。
2)Socket服務(wù)端基類
相對(duì)于Socket客戶端基類,同樣我們也創(chuàng)建一個(gè)Socket服務(wù)端基類,通過繼承的方式,我們可以用于簡(jiǎn)化代碼的重復(fù)性。該服務(wù)端基類稱為 TCP服務(wù)器管理基類 BaseSocketServer,負(fù)責(zé)在獨(dú)立的線程中偵聽指定的端口,如果有客戶端連接進(jìn)來,則進(jìn)行相應(yīng)的處理。
同樣我們也派生了兩個(gè)服務(wù)端的基類,方便對(duì)不同的Socket客戶端進(jìn)行差異性處理,如對(duì)應(yīng)上面的中心客戶端類ClientOfCall,我們?cè)黾右粋€(gè)對(duì)應(yīng)的服務(wù)端類ServerForCall,其他的也類似,它們的繼承關(guān)系如下所示。
另外,由于我們?cè)试S不同的Socket客戶端類(如ClientOfCall、ClientOfShop)的接入,那么在服務(wù)器端也會(huì)有對(duì)應(yīng) Socket服務(wù)端類(ServerForCall、ServerForShop)進(jìn)行不同端口的偵聽,一旦在自己所屬端口有Socket接入,那么服務(wù) 端類會(huì)分派給不同Socket客戶端管理類來處理他們的關(guān)系和數(shù)據(jù),這樣也就進(jìn)一步引入一個(gè)客戶端管理類的概念,它對(duì)應(yīng)不同的Socket客戶端。
這里也根據(jù)需要定義了一個(gè)Socket客戶端管理基類BaseClientManager
3)數(shù)據(jù)接收處理基類
在不同的Socket客戶端連接到服務(wù)端后,服務(wù)端開辟一個(gè)新的線程進(jìn)行對(duì)應(yīng)的Socket數(shù)據(jù)通訊,那么數(shù)據(jù)通訊這里面的管理,我們可以為不同的Socket客戶端訂做一個(gè)對(duì)應(yīng)的數(shù)據(jù)接收處理類,專門針對(duì)特定的Socket客戶端連接的數(shù)據(jù)進(jìn)行處理。
這里也根據(jù)需要定義了一個(gè)數(shù)據(jù)接收的基類BaseReceiver,同樣我們派生對(duì)應(yīng)不同客戶端的數(shù)據(jù)接收類ReceivedForCall、ReceivedForShop和ReceivedForBridge等幾個(gè)具體的數(shù)據(jù)處理類,它們的繼承關(guān)系如下所示。
3、框架界面設(shè)計(jì)
1)參數(shù)配置
Socket服務(wù)器需要一些參數(shù)來確定偵聽的IP地址、端口,以及數(shù)據(jù)庫(kù)的連接信息,各種數(shù)據(jù)的處理時(shí)間間隔等參數(shù),因此需要提供一個(gè)較好的管理界面來進(jìn)行管理,本框架使用基于本地配置文件的參數(shù)管理方式進(jìn)行管理,參數(shù)界面如下所示。
客戶端也同樣需要配置一些參數(shù),用來確定連接的服務(wù)器IP及端口信息,如下配置界面所示。
Socket服務(wù)器監(jiān)控界面,需要顯示一些基礎(chǔ)的狀態(tài)和Socket連接等基礎(chǔ)信息,作為我們對(duì)整體狀態(tài)的了解,同時(shí)這些信息可以記錄到日志里面供我們進(jìn)行查閱和分析。
除了上面總體的設(shè)計(jì)外,其中還有一個(gè)地方需要細(xì)致的展開來介紹,就是對(duì)Socket傳輸消息的封裝和拆包,一般的Socket應(yīng)用,多數(shù)采用基于順 序位置和字節(jié)長(zhǎng)度的方式來確定相關(guān)的內(nèi)容,這些處理對(duì)我們分析復(fù)雜的協(xié)議內(nèi)容,簡(jiǎn)直是一場(chǎng)災(zāi)難,協(xié)議位置一旦變化或者需要特殊的處理,就是很容易出錯(cuò)的, 而且大多數(shù)代碼充斥著很多位置的數(shù)值變量,分析和理解都是非常不便的。
如果對(duì)于整體的內(nèi)容,使用一種比較靈活的消息格式,如JSON格式,那么我們可以很好的把消息封裝和消息拆包解析兩個(gè)部分,交給第三方的JSON解 析器來進(jìn)行,我們只需要關(guān)注具體的消息處理邏輯就可以了,而且對(duì)于協(xié)議的擴(kuò)展,就如JSON一樣,可以自由靈活,這樣瞬間,整個(gè)世界都會(huì)很清靜了。由于篇 幅的原因,我將在下一個(gè)隨筆在進(jìn)行介紹JSON格式的消息處理過程。
除了上面的場(chǎng)景外,我們還需要考慮用戶消息的加密和校驗(yàn)等內(nèi)容處理,這樣才能達(dá)到安全、完整的消息處理,我們可以采用 RSA公鑰密碼系統(tǒng)。平臺(tái)通過發(fā)送平臺(tái)RSA公鑰消息向終端告知自己的RSA公鑰,終端回復(fù)終端RSA公鑰消息,反之亦然。這樣平臺(tái)和終端的消息,就可以 通過自身的私鑰加密,讓對(duì)方公鑰解密就可以了。
分享標(biāo)題:Socket開發(fā)框架之框架設(shè)計(jì)及分析
網(wǎng)頁(yè)路徑:http://m.fisionsoft.com.cn/article/dhdppdp.html


咨詢
建站咨詢
