天天看點

mina 架構知識點部分整理

    之前做個一段時間的遊戲開發,用到了mina通訊架構,怕久了忘記,這裡整理下知識點。第一個就是搞清楚他的核心nio,但是講這個就必須先搞清楚bio。jdk1.4之前用的是阻塞-bio,jdk1.4之後引入nio-非阻塞io, jdk1.7後引入了 aio-異步非阻塞io。bio相信大家入門時都寫過:

bio程式設計時需要一個線程去循環檢測是否有新的socket連接配接進來,連接配接進來後socket就放入新的線程或者連接配接池。是以socket個數和線程個數m:n,m>n。bio是面相流的,建立連結,讀取,寫入都是同步阻塞的。這就意味着對方處理資料較慢或者網絡傳輸資料較慢時,處理這個請求的線程隻有阻塞等待。就算用了線程池,也會把線程吃完,後續處理不能正常進行。

nio socket程式設計

    将通道和對應的事件會一起注冊到selector上。事件分四種:伺服器接收用戶端連接配接,用戶端連接配接伺服器,讀事件,寫事件。所有的事件都可以共用一個selector,也可以分開。

    selector選擇器也需要一個線程去輪訓是否有就緒的通道。原來程式要讀取對方傳來的資料時,需要阻塞等待對方的流資料在網卡組裝好後,才能讀取。就像你要下樓等到快遞員給你送快遞。而nio是當程式需要讀取資料時,隻需要将讀取事件和通道一起注冊到選擇器上,選擇器一直輪訓你關心的資料準備好沒有。當資料到達網卡且準備好時,就被輪訓出來。 當有就緒通道時,就把通道裡面的資料讀到緩沖區裡面。通道是否就緒,是由作業系統決定的。

mina通訊架構的粘包和斷包問題

什麼是粘包,斷包問題?

tcp是面相位元組流的,他的消息是無邊界概念的,就好比文章沒有标點符号,沒有分段,全部粘在一起。那麼發送方發送好幾個包,接收方當作一個包一次性接收,就叫粘包。而當發送方發送的資料太大時,又不的不拆成幾個包分開發送,就叫斷包。那怎麼解決呢?

     1,常見的就是用特殊分隔符分割。比如\r\n之類的。

     2,還有就是把消息的長度加到消息頭部。

未完待續...