gpt4 book ai didi

java - Netty不会写

转载 作者:行者123 更新时间:2023-11-29 09:59:30 25 4
gpt4 key购买 nike

当尝试用 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: ...)

注意:这也会在使用 ObjectEncoder 时抛出, 但你的对象没有实现 Serializable

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

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

通常使用以下处理程序:

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 是一种基于流的协议(protocol),您通常需要附加某种形式的数据包大小,因为您可能无法收到您编写的准确数据包。参见 Dealing with a Stream-based Transport在 Netty wiki 中获取更多信息。

关于java - Netty不会写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40862160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com