Mina tcp與NIO通訊問題

2021-07-29 10:25:54 字數 988 閱讀 4232

1.訊息解碼,編碼問題

開發中,我client用的是mina,服務端是'c#' 寫的nio,nio中更多是以byte形式來讀與寫.

如果用mina與nio進行互動的話,nio可以解碼mina,但是mina卻死活接收不到來自nio的資訊。

折騰了好久,最後才找到原因,很簡單。因為如果你用了mina封裝的編碼過濾器,如textlinecodecfactory。這預設是以換行符\r

\n為標誌結尾的行解析方式,若沒有\r

\n,則一直處於讀狀態.

知道原因,那就好辦了

方法如下:

1.自定義過濾器

2.在nio發過來的資料後面加上\r\n

3.在新增編碼過濾器的同時制定結束符:

new protocolcodecfilter(new textlinecodecfactory(charset

.forname("utf-8"), "\\0", "\\0")));

//前者為編碼,編碼過程中,預設在後面加上\\0,後者為解碼,解碼以\\0為結束的依據。

2.sessionidle的幾個用處

sessionidle有兩個狀態,讀跟寫。當讀或寫在指定的時間內沒有事件響應時就會進入該狀態。

之前做長連線斷線重連時,重寫了心跳機制,最後整的**過於繁瑣,後來發現,利用該機制也可以進行乙個簡單的心跳判斷。

如:在指定的時間內沒有收到伺服器的訊息(讀操作),就可以在這裡進行斷線判斷操作。

3、斷線重連

需要重連的情況:

1.handler捕獲異常時

2.連線超時

3.長時間沒有收到伺服器的心跳(訊息),這個是要求伺服器不斷定時傳送訊息。

具體重連操作放在實現ioservicelistener的監聽中,即sessiondestroyed()方法下。

nio通訊過程

初步了解nio,但是一直很難理解。網上看到一篇博文,感覺講的非常好。nio通訊過程情景模擬 1.學校 serversocketchannel 2.學校教務處 selector 3.老師 serversocket 4.學生 socketchannel 5.員工號 學生號 selectionkey 學校...

NIO通訊示例

讀者可以將 拷貝到編譯器上跑一跑,如果看了注釋還有不懂的地方,可以參考 nio基礎 一 之buffer nio基礎 二 之channel nio基礎 三 之selector 第三篇尤為重要對看懂大體框架有很大意義。public class const 類說明 nio通訊客戶端 public clas...

2 1 NIO網路通訊

selector的應用 非阻塞nio的demo 基於serversocketchannel 非阻塞nio的demo 基於datagramchannel 前文 1.1 nio 和 bio 對比分析,引出 nio 介紹了他們的區別,該篇介紹 如何使用nio進行網路通訊.nio中,執行緒通常將非阻塞 io...