[英]Sending byte array in Netty
我正在使用LengthFieldBasedFrameDecoder
來發送和接收byte[]
但是客戶端在寫入后會收到錯誤java.nio.channels.ClosedChannelException
。
這是管道工廠;
@Override
public ChannelPipeline getPipeline() throws Exception {
String charSet = EvamProperties.charSet.get();
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("framer", new LengthFieldBasedFrameDecoder(1000000,0,4,0,4));//16KB
pipeline.addLast("decoder", new OneToOneDecoder() {
@Override
protected Object decode(ChannelHandlerContext channelHandlerContext, Channel channel, Object o) throws Exception {
if (!(o instanceof ChannelBuffer)) {
return o;
}
ChannelBuffer buffer = (ChannelBuffer) o;
int length = buffer.readInt();
byte[] bytes = new byte[length];
buffer.readBytes(bytes);
return bytes;
}
});
pipeline.addLast("encoder", new OneToOneEncoder() {
@Override
protected Object encode(ChannelHandlerContext channelHandlerContext, Channel channel, Object o) throws Exception {
if(!(o instanceof byte[])) {
return o;
}
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
buffer.writeInt(((byte[]) o).length);
buffer.writeBytes((byte[])o);
return buffer;
}
});
pipeline.addLast("handler", new RawEventServerHandler());
return pipeline;
}
客戶以這種方式寫它;
channel.write(eventStr.getBytes());
在這個用於調試的代碼中,要發送的數據是String但我不能使用StringDecoder。
LenghtFieldBasedDecoder
是否是發送和接收byte[]
正確方法,如果沒有,我該怎么辦?
編輯:
我發現另一個線程實際關閉了通道,因此解決了java.nio.channels.ClosedChannelException
,但我仍然渴望學習這類工作的最佳實踐。
我根據您的問題看到了3個不同的用例:
length
的幀,您需要將幀捕獲為byte[length]
並將其傳輸給用戶 length
幀,您需要將幀捕獲為byte[length]
並將其傳輸給用戶 byte[]
數組 在(1) LengthFieldBasedFrameDecoder
是正確的選擇的情況下,它允許您基於存儲在幀中的長度捕獲幀。 在(2)的情況下,如果您知道所有幀具有相同的大小,則FixedLengthFrameDecoder
應該足夠了。 在(3)的情況下你不需要任何特殊的解碼器,所有可讀字節都可以從傳入的ByteBuf
獲取並傳輸到下一個處理程序,但是我不確定在真實應用程序中這種方法有多么有用,因為很可能你是'處理某些特定類型/大小的消息,Netty不保證消息將如何分割,一條消息可以作為N個不同的塊到達。
如果你想解碼傳入的字節並跳過捕獲步驟,還有ReplayingDecoder
對情況(1-2)很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.