做自己的Socket網路通訊框架 實現篇

2021-05-06 17:01:55 字數 1065 閱讀 6283

,關於框架的設計思想在前面一篇已經做了描述,在這裡著重介紹一下關鍵類的實現。

niosocketacceptor、niosocketconnector兩個類的功能比較簡單,看一眼就知道是什麼意思,filter定義了過濾器基礎方法,主要包括以下的方法:init、destroy和getorder三個方法。

後面繼承了兩個介面inputfilter和outputfilter兩個介面的定義如下:

iohandler 讀取資料和傳送資料的介面,定義如下:

同時實現的乙個通用的socket讀寫類abstractiohandler,這個是乙個抽象類,根據專案的需求繼承這個類,然後實現三個個方法

注:一般報文的定義都是報文的頭幾個位元組用來描述整個報文長度,

abstractiohandler根據這個報文長度來接收乙個完整的報文,int getlenthoflenth 獲得使用幾個直接來表示乙個報文的長度,比如8,那麼就是表示報文前8位是用來表示報文長度的。int getlenth(byte lenth);表示通過乙個

byte lenth陣列獲得乙個報文的int長度,因為報文長度可能會用不同的形式表示,比如用8位的乙個字串表示00000435表示報文長度是

435個位元組,也有可能用4位的16進製表示,例如00f0 表示報文有15個位元組。 boolean hascontainhead()報文頭的本身長度是否包涵在報文頭裡面,舉例說明一下,

00000435表示收到的報文頭,總共8位,如果報文頭本身的長度包含的報文裡面,那說明下面還有

435 - 8 =427個位元組需要接收,反之

如果報文頭本身的長度不包含的報文裡面,

那說明下面還有

435個位元組要接收。

如果有特殊的需求,只要重新寫乙個類實現

iohandler介面就可以了。

session 用於過濾器之間傳遞資料和使用者資訊,定義的介面如下

下面介紹一下這個框架的核心部分,abstractprocessor由n+1個執行緒組成,乙個執行緒負責從socket讀取資料,然後把資料放入佇列等待處理,n(cpu的個數或者核數)個處理執行緒,負責從佇列中讀取event 進行處理。具體實現請參考**。

Socket網路通訊

服務端的程式如下 1.建立乙個伺服器端socket,即serversocket,指定繫結的埠,並監聽此埠8888 serversocket serversocket new serversocket 8888 socket socket null 記錄客戶端的數量 int count 0 syste...

socket網路通訊

read write recv send readv writev recvmsg sendmsg recvfrom sendto include ssize t read int fd,void buf,size t count ssize t write int fd,const void bu...

socket網路通訊《二》

socket網路通訊 本文注意基於socket來分析tcp連線建立過程。先回顧一下tcp連線建立過程 主機a執行的是tcp客戶端程式,主機b執行的是tcp伺服器程式,最初兩端tcp程序處於closed態,a主動開啟連線,對應客戶端connect函式發起連線,b被動接受連線,對應於伺服器listen函...