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 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); 

在得到exception的根本原因后,可能会出现多个问题:

java.lang.UnsupportedOperationException:
unsupported message type: (expected: ...)

注意:使用ObjectEncoder时也会引发此问题,但您的对象不实现Serializable

默认的Netty通道只能发送ByteBufFileRegion 。 您需要通过向管道添加更多处理程序或将它们手动转换为ByteBuf来将对象转换为这些类型。

ByteBuf是字节数组的Netty变体,但具有性能潜力,因为它可以存储在直接存储空间中。

通常使用以下处理程序:

转换String使用StringEncoder要转换Serializable使用ObjectEncoder (警告,与普通Java对象流不兼容)要转换byte[]使用ByteArrayEncoder

注意:由于TCP是基于流的协议,因此您通常需要附加某种forms的数据包大小,因为您可能无法收到您编写的确切数据包。 有关详细信息,请参阅在Netty wiki中处理基于流的传输 。