Mina學習 自定義協議包的傳輸

2021-09-17 22:46:52 字數 2714 閱讀 7252

mina實戰demo – c/s自定義協議傳輸

github專案原始碼

為什麼要進行自定義協議傳輸?

因為傳輸過程往往不是乙個字串就可以傳輸全部資訊,並且應用程式和網路通訊之間存在物件與二進位制之間的轉換關係。所以需要結合業務編寫自定義協議包進行傳輸。

編寫自定義協議的基本步驟

通過mina文件可以看到,要實現自定義協議傳輸需要實現protocolcodecfactory介面,而protocolcodecfactory介面有兩個抽象方法,getdecoder(iosession session)

和 getencoder(iosession session) 方法。所以要先實現protocoldecoder和protocolencoder介面實現編解碼器。

1. 自定義協議資料報

協議資料報包含協議頭和協議體,協議頭儲存協議(協議頭+協議體)的長度length和版本資訊flag;協議體儲存協議內容。

public

class

protocolpack

getter and setters...

}

2. 自定義編碼器

編碼器將物件轉成位元組存入緩衝區中,並傳遞到下一層。

@override

public

void

encode

(iosession session, object msj, protocolencoderoutput out)

throws exception

3. 自定**碼器

解碼器將對應的位元組陣列解析成物件,在傳輸過程中可能會出現半包(資料傳輸不完整)的問題,所以需要乙個context上下文儲存傳輸的buffer,並將context

放入session中,下次有新的傳輸來之後就從本類的session中找到上下文,以追加的方式新增buffer

private

class

context

public

void

reset()

getters and setters...

}

@override

public

void

decode

(iosession iosession, iobuffer iobuffer, protocoldecoderoutput out)

throws exception

else

if(length >= packheadlength && length-packheadlength <= buff.

remaining()

)else}if

(buff.

hasremaining()

)else

}

4. 自定義編譯碼工廠

編譯碼工廠例項化編解碼器

public

class

protocolfactory

implements

protocolcodecfactory

getencoder and getdecoder...

}

5. 服務端

服務端主要實現編譯碼過濾器,session引數設定,繫結操作

public

class

protocolserver

}

6. 服務端handle

主要實現了異常捕獲、等待時間、訊息接收方法

public

class

serverhandle

extends

iohandleradapter

@override

public

void

exceptioncaught

(iosession session, throwable cause)

throws exception

@override

public

void

messagereceived

(iosession session, object msg)

throws exception

}

7. 客戶端

客戶端除去過濾器,session設定還通過connectfuture監聽客戶端的連線狀態,傳送資料

public

class

protocolclient}}

);}private

static

void

senddate

(iosession session)

}}

8. 客戶端handle

主要實現了等待時間、訊息接收方法

public

class

clienthandle

extends

iohandleradapter

}@override

public

void

messagereceived

(iosession session, object message)

throws exception

}

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

自定義協議封裝包頭 包體

底層通訊訊息類,定義訊息id 訊息體,和初始化 1 using system 23 4 底層通訊訊息 5 6 public class tsocketmessage idisposable 7 2223 public void dispose 24 2829 protected virtual vo...

簡單高效可靠的自定義通訊協議(傳輸協議)

取 高效簡單可靠 這幾個形容詞還是很虛的,畢竟這是yy出來的東西。設計的目的在於 在收發雙方能夠正常執行的情況下,盡可能高的利用網路傳輸能力 不使用一應一答 以及提高傳輸效率 無須對每個報文幀進行應答 對比xmodem kermit,以及借鑑tcp的協議棧設計思想,設計一套通訊協議 1,定義傳送方s...