当尝试使用 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();}
我可以做什么来调试这个问题?
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: ...)
Notice:当使用ObjectEncoder https://netty.io/4.0/api/io/netty/handler/codec/serialization/ObjectEncoder.html,但是你的对象没有实现Serializable http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true
默认的 Netty 通道只能发送ByteBuf
s and FileRegion
s。您需要通过向管道添加更多处理程序或手动将它们转换为ByteBuf
s.
A ByteBuf
是字节数组的 Netty 变体,但具有性能潜力,因为它可以存储在直接内存空间中。
常用的处理程序如下:
要转换一个String
use a StringEncoder
要转换一个Serializable
use a ObjectEncoder
(警告,与普通 Java 对象流不兼容)
要转换一个byte[]
use a ByteArrayEncoder
Notice:由于 TCP 是基于流的协议,因此您通常需要附加某种形式的数据包大小,因为您可能不会收到您编写的确切数据包。看处理基于流的传输 http://netty.io/wiki/user-guide-for-4.x.html#wiki-h3-11在 Netty wiki 中了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)