2015-05-06 62 views
1

我正在使用一個使用DelimiterBasedFrameDecoder進行解碼的協議,只要收到換行符就會分割bytebuf。Netty - 用換行符傳輸字符串的最佳方法?

不幸的是,必須將發射與換行符字符串的可能性。現在,解碼器讀取字符串中的換行符,並相應地創建幀。

我的想法是編碼這些字符串使用Base64和framedecoder完成工作後,他們進行解碼。我的問題是,現在有沒有更好的解決這個問題的方法? Base64帶來了開銷以及額外的編碼/解碼工作。

使用另一個分隔符是不可能的,因爲我需要爲我的協議的報頭字段。在您的管道

回答

2

使用NUL定界符基於幀的解碼器和編碼這一點。分隔符文檔是here。例如在解碼器管道中添加以下內容。

pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.nulDelimiter())); 

同樣應該使用,同時編碼例如,

@Sharable 
public class NulEncoder extends OneToOneEncoder { 

@Override 
protected Object encode(ChannelHandlerContext ctx, Channel channel, 
     Object msg) throws Exception { 
    ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg, Delimiters.nulDelimiter()); 
    return buffer; 
} 
} 
+0

嘿感謝您的回答!在此期間我提出了另一種解決方案。我只是從管道中刪除framedecoder當我收到請求/響應的整個頭並添加[FixedLengthFrameDecoder](https://netty.io/4.0/api/io/netty/handler/codec/FixedLengthFrameDecoder.html) ,如下所示,解碼器不會拆分每個換行符,而是在接收到具有新幀解碼器長度的字節量時立即拆分。 – Chocolate

+0

是的,如果您傳輸二進制文件,那麼這是一個好方法。如果你正在傳輸字符串,那麼NUL可能是更好的選擇。 – Abe

相關問題