当试图用网状写,写入的数据从来没有在远程端,使用Wireshark确认结束。
我试过了:
//Directly using writeAndFlush
channel.writeAndFlush(new Packet());
//Manually flushing
channel.write(new Packet());
channel.flush();
// Even sending bytes won't work:
channel.writeAndFlush(new byte[]{1,2,3});
无例外被捕获时,我把它包在try{...}catch(Throwable e){e.printStackTrace();}
我能做些什么来调试这个问题?
网状是异步的,也就是说,它不会抛出异常时,写入失败。 而不是抛出异常,则返回一个Future<?>
,当要求进行,将被更新。 确保记录从这个来作为你的第一个调试步骤任何异常:
channel.writeAndFlush(...).addListener(new GenericFutureListener<Future<Object>>() {
@Override
public void operationComplete(Future<Object> future) {
// TODO: Use proper logger in production here
if (future.isSuccess()) {
System.out.println("Data written succesfully");
} else {
System.out.println("Data failed to write:");
future.cause().printStackTrace();
}
}
});
或者更简单地说:
channel.writeAndFlush(...).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
你得到的异常的根本原因之后,可能有多个问题:
java.lang.UnsupportedOperationException:
unsupported message type: <type> (expected: ...)
注意:这也是用时抛出ObjectEncoder
,但你的对象不实现Serializable
默认Netty的通道只能发送ByteBuf
S和FileRegion
秒。 你需要通过添加更多的处理器的管道,或手动进行转换到你的对象,这些类型的转换ByteBuf
秒。
甲ByteBuf
是一个字节数组的Netty的变体,但具有用于性能的潜力,因为它可以被存储在所述直接存储器空间。
下列处理程序常用的有:
要转换String
使用StringEncoder
要转换一个Serializable
使用ObjectEncoder
(警告,与正常的Java对象流不兼容)要转换byte[]
使用ByteArrayEncoder
注意:由于TCP是基于流的协议,通常希望某种形式的数据包大小的连接,因为您可能不会收到你写准确的数据包。 见与基于流的传输处理中的Netty维基了解更多信息。