,關於框架的設計思想在前面一篇已經做了描述,在這裡著重介紹一下關鍵類的實現。
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函...