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...