2012-01-18 79 views
1

我正在爲使用Netty的客戶端/服務器通信設計一個二進制協議,發送的字節數不是固定的數量,可以是任意大小。在Netty中處理碎片

客戶端發送這樣的:

第一個4個字節來表示一個id號 剩餘的字節是一個字符串

在這個例子中我所看到的,該消息已被固定的大小,但字符串內容可以是任何大小,並且需要確保它在服務器接收時不被分段。我如何在Netty中實現這一點?

在此先感謝。

回答

3

你如何確定消息的結束?零?我會檢查出的Netty重放解碼器:

http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/codec/replay/ReplayingDecoder.html

這讓事情變得容易讓你。只要繼續閱讀,直到找到零。如果在達到零之前用完字節,將拋出異常以退出解碼方法。當有更多字節可用時,將再次調用解碼方法,並將現有字節和新字節合併到一個ChannelBuffer中。

這個循環可以重複,直到你在ChannelBuffer中有整個消息...然後你可以傳遞到下一層進行處理。

如果有可能改變你的協議,我會增加一個長度,因爲能夠讀取的長度比檢查每個字節的零得多。

+1

喜加雷斯,感謝您的答案 - 非常讚賞。我目前沒有使用任何東西來確定消息的結束。一旦我通過調用buffer.readLong()檢索id,然後我調用buffer.toString(String charsetName) - 這不是理想的。當你提到發送有效負載的大小時,你是否建議將它添加到開始並等待直到收到長度,並使用該任意數字來確定在服務器上等待更多字節? – algolicious 2012-01-19 10:12:23

+0

是的。一旦你有一個長度,你可以改爲使用LengthFieldBasedFrameDecoder(如果你的消息可能非常大,儘管基於SimpleChannelUpstreamHandler編寫你自己的消息可能更好,這樣緩衝區只能分配一次)。 – Gareth 2012-01-19 16:27:05