Netty不会写
Netty doesn't write
当尝试用 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 是异步的,这意味着它不会在写入失败时抛出异常。它不会抛出异常,而是 returns 一个 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
, but your object does not implements Serializable
时抛出
默认的 Netty 通道只能发送 ByteBuf
s 和 FileRegion
s。您需要通过向管道添加更多处理程序或手动将它们转换为 ByteBuf
s.
来将对象转换为这些类型
一个ByteBuf
是一个字节数组的Netty变体,但是有性能的潜力,因为它可以存储在直接内存space.
常用的处理器如下:
To convert a String
use a StringEncoder
To convert a Serializable
use a ObjectEncoder
(warning, not compatible with normal Java object streams)
To convert a byte[]
use a ByteArrayEncoder
注意:由于 TCP 是基于流的协议,您通常需要附加某种形式的数据包大小,因为您可能无法收到您编写的准确数据包。有关详细信息,请参阅 Netty wiki 中的 Dealing with a Stream-based Transport。
当尝试用 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 是异步的,这意味着它不会在写入失败时抛出异常。它不会抛出异常,而是 returns 一个 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
, but your object does not implements Serializable
默认的 Netty 通道只能发送 ByteBuf
s 和 FileRegion
s。您需要通过向管道添加更多处理程序或手动将它们转换为 ByteBuf
s.
一个ByteBuf
是一个字节数组的Netty变体,但是有性能的潜力,因为它可以存储在直接内存space.
常用的处理器如下:
To convert a
String
use aStringEncoder
To convert aSerializable
use aObjectEncoder
(warning, not compatible with normal Java object streams) To convert abyte[]
use aByteArrayEncoder
注意:由于 TCP 是基于流的协议,您通常需要附加某种形式的数据包大小,因为您可能无法收到您编写的准确数据包。有关详细信息,请参阅 Netty wiki 中的 Dealing with a Stream-based Transport。