Netty是异步的,这意味着在写入失败时它不会引发异常。它不会引发异常,而是返回一个
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: ...)
注意:
使用时也会抛出此错误
ObjectEnprer,但您的对象未实现
Serializable
默认的Netty通道只能发送
ByteBufs和
FileRegion。您需要通过向管道添加更多处理程序,或将它们手动转换为
ByteBufs
,将对象转换为这些类型。
A
ByteBuf是字节数组的Netty变体,但具有性能潜力,因为它可以存储在直接存储空间中。
通常使用以下处理程序:
转换
String用途StringEnprer
转换Serializable用途ObjectEnprer(警告,与普通Java对象流不兼容)转换byte[]用途ByteArrayEnprer
注意: 由于TCP是基于流的协议,因此您通常需要附加某种形式的数据包大小,因为您可能不会收到写入的确切数据包。有关更多信息,请参见Netty
Wiki中的处理基于流的传输。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)