Java 内蒂没有';不写
当尝试使用netty写入时,写入的数据永远不会在远程端结束,这一点由Wireshark确认 我试过:Java 内蒂没有';不写,java,netty,Java,Netty,当尝试使用netty写入时,写入的数据永远不会在远程端结束,这一点由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 byt
//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();}
如何调试此问题?Netty是异步的,这意味着当写入失败时它不会抛出异常。它不会抛出异常,而是返回一个
未来
,当请求完成时将更新它。确保将由此产生的任何异常记录为第一个调试步骤:
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();
}
}
});
找到异常的根本原因后,可能会出现多个问题:
java.lang.UnsupportedOperationException:
不支持的消息类型:(应为:…)
注意:在使用时也会抛出,但您的对象不会实现
默认Netty频道只能发送ByteBuf
s和FileRegion
s。您需要将对象转换为这些类型,方法是向管道中添加更多处理程序,或者手动将它们转换为ByteBuf
s
ByteBuf
是字节数组的净变体,但由于它可以存储在直接内存空间中,因此具有潜在的性能
通常使用以下处理程序:
要转换字符串
请使用StringEncoder
要转换可序列化的文件,请使用ObjectEncoder
(警告,与普通Java对象流不兼容)
要转换字节[]
请使用ByteArrayEncoder
注意:由于TCP是一种基于流的协议,您通常需要附加某种形式的数据包大小,因为您可能无法接收您编写的确切数据包。有关更多信息,请参阅Netty wiki中的
channel.writeAndFlush(...).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);