我使用LengthFieldBasedFrameDecoder
來發送和接收byte[]
但客戶端寫入後得到錯誤java.nio.channels.ClosedChannelException
。在Netty中發送字節數組
這裏是管道工廠;
@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());
在這段代碼中用於調試目的發送的數據是字符串,但我不能使用StringDecoder。
請問LenghtFieldBasedDecoder
發送和接收是否正確byte[]
,如果沒有,我該怎麼辦?
編輯:
我發現另一個線程實際關閉通道使java.nio.channels.ClosedChannelException
解決,但我仍然渴望去學習這種工作的最佳實踐。
首先,如果使用Netty 4.x,則需要刷新某處(例如'writeAndFlush')。其次,'ClosedChannelException'意味着你試圖在通道已經關閉時讀取或寫入通道。可能有幾個原因。你在客戶端和服務器兩端的RawEventServerHandler是什麼? –
謝謝你看到我的編輯。 –