之前做個一段時間的遊戲開發,用到了mina通訊框架,怕久了忘記,這裡整理下知識點。第乙個就是搞清楚他的核心nio,但是講這個就必須先搞清楚bio。jdk1.4之前用的是阻塞-bio,jdk1.4之後引入nio-非阻塞io, jdk1.7後引入了 aio-非同步非阻塞io。bio相信大家入門時都寫過:
while(true)
bio程式設計時需要乙個執行緒去迴圈檢測是否有新的socket連線進來,連線進來後socket就放入新的執行緒或者連線池。所以socket個數和執行緒個數m:n,m>n。bio是面相流的,建立鏈結,讀取,寫入都是同步阻塞的。這就意味著對方處理資料較慢或者網路傳輸資料較慢時,處理這個請求的執行緒只有阻塞等待。就算用了執行緒池,也會把執行緒吃完,後續處理不能正常進行。
nio socket程式設計
將通道和對應的事件會一起註冊到selector上。事件分四種:伺服器接收客戶端連線,客戶端連線伺服器,讀事件,寫事件。所有的事件都可以共用乙個selector,也可以分開。
while(true)
}
selector選擇器也需要乙個執行緒去輪訓是否有就緒的通道。原來程式要讀取對方傳來的資料時,需要阻塞等待對方的流資料在網絡卡組裝好後,才能讀取。就像你要下樓等到快遞員給你送快遞。而nio是當程式需要讀取資料時,只需要將讀取事件和通道一起註冊到選擇器上,選擇器一直輪訓你關心的資料準備好沒有。當資料到達網絡卡且準備好時,就**訓出來。 當有就緒通道時,就把通道裡面的資料讀到緩衝區裡面。通道是否就緒,是由作業系統決定的。
mina通訊框架的粘包和斷包問題
什麼是粘包,斷包問題?
tcp是面相位元組流的,他的訊息是無邊界概念的,就好比文章沒有標點符號,沒有分段,全部粘在一起。那麼傳送方傳送好幾個包,接收方當作乙個包一次性接收,就叫粘包。而當傳送方傳送的資料太大時,又不的不拆成幾個包分開傳送,就叫斷包。那怎麼解決呢?
1,常見的就是用特殊分隔符分割。比如\r\n之類的。
2,還有就是把訊息的長度加到訊息頭部。
//封包
public void encode(iosession session, object message,
protocolencoderoutput out) throws exception
//拆包
@override
public messagedecoderresult decodable(iosession session, iobuffer buf)
private boolean messagecomplete(iobuffer in)
@override
public messagedecoderresult decode(iosession session, iobuffer buf,
protocoldecoderoutput out) throws exception
未完待續... 部分整理知識點
知識點回顧 萬用字元選擇器 外邊距 margin right left 文字水平對齊 text ailgn center left right 文字居中對齊 行高等於高 line height 首行縮排 text indent 常用塊級標籤 div p h1 h6 ul li 行內標籤 左右排列 s...
C 部分知識點簡單整理
第二章 1.類是物件的抽象,物件則是類的例項。類是抽象的,不為其分配儲存空間,物件是具體的,要為其分配儲存空間。類與結構的異同。2.private 私有的 只能被本類的成員函式引用。類外的不能引用 友元類除外 預設值。public 公用的 既可以被本類的成員函式引用,也可被本類中的其他函式引用。pr...
整理知識點
python中的變數不需要宣告。每個變數在使用前都必須賦值,變數賦值以後該變數才會被建立。在python 中,變數就是變數,它沒有型別,我們所說的 型別 是變數所指的記憶體中物件的型別。乙個變數可以通過賦值指向不同型別的物件。python3 有六個標準的資料型別 不可變資料 number 數字 st...