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 byte[]{1,2,3});
当我将它包装在try{...}catch(Throwable e){e.printStackTrace();}
时,没有exceptiontry{...}catch(Throwable e){e.printStackTrace();}
我该怎么做来调试这个问题?
Netty是异步的,这意味着它在写入失败时不会抛出exception。 它不会抛出exception,而是返回Future>
,它将在请求完成时更新。 确保记录来自此的任何exception作为您的第一个调试步骤:
channel.writeAndFlush(...).addListener(new GenericFutureListener>() { @Override public void operationComplete(Future
或者更简单:
channel.writeAndFlush(...).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
在得到exception的根本原因后,可能会出现多个问题:
java.lang.UnsupportedOperationException:
unsupported message type: (expected: ...)
注意:使用ObjectEncoder
时也会引发此问题,但您的对象不实现Serializable
默认的Netty通道只能发送ByteBuf
和FileRegion
。 您需要通过向管道添加更多处理程序或将它们手动转换为ByteBuf
来将对象转换为这些类型。
ByteBuf
是字节数组的Netty变体,但具有性能潜力,因为它可以存储在直接存储空间中。
通常使用以下处理程序:
转换
String
使用StringEncoder
要转换Serializable
使用ObjectEncoder
(警告,与普通Java对象流不兼容)要转换byte[]
使用ByteArrayEncoder
注意:由于TCP是基于流的协议,因此您通常需要附加某种forms的数据包大小,因为您可能无法收到您编写的确切数据包。 有关详细信息,请参阅在Netty wiki中处理基于流的传输 。