当尝试使用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 byte[]{1,2,3});当我将它包装在try{...}catch(Throwable e){e.printStackTrace();}中时,没有发现异常。
我能做些什么来调试这个问题?
发布于 2016-11-29 09:28:51
Netty是异步的,这意味着它不会在写失败时抛出异常。它不是抛出异常,而是返回一个Future<?>,该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和FileRegion。您需要通过向管道中添加更多的处理程序或手动将它们转换为ByteBuf来将对象转换为这些类型。
ByteBuf是字节数组的Netty变体,但具有性能潜力,因为它可以存储在直接内存空间中。
以下处理程序是常用的:
要转换
String,使用StringEncoder来转换Serializable使用ObjectEncoder(警告,不兼容正常的ObjectEncoder对象流)来转换byte[]使用ByteArrayEncoder
注意:由于TCP是一种基于流的协议,所以通常需要附加某种形式的数据包大小,因为您可能没有收到所编写的确切数据包。有关更多信息,请参见Netty中的处理基于流的传输。
https://stackoverflow.com/questions/40862160
复制相似问题