网状不写网状不写(Netty doesn't write)

2019-05-12 10:30发布

当试图用网状写,写入的数据从来没有在远程端,使用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();}

我能做些什么来调试这个问题?

Answer 1:

网状是异步的,也就是说,它不会抛出异常时,写入失败。 而不是抛出异常,则返回一个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的通道只能发送ByteBuf S和FileRegion秒。 你需要通过添加更多的处理器的管道,或手动进行转换到你的对象,这些类型的转换ByteBuf秒。

ByteBuf是一个字节数组的Netty的变体,但具有用于性能的潜力,因为它可以被存储在所述直接存储器空间。

下列处理程序常用的有:

要转换String使用StringEncoder要转换一个Serializable使用ObjectEncoder (警告,与正常的Java对象流不兼容)要转换byte[]使用ByteArrayEncoder

注意:由于TCP是基于流的协议,通常希望某种形式的数据包大小的连接,因为您可能不会收到你写准确的数据包。 见与基于流的传输处理中的Netty维基了解更多信息。



文章来源: Netty doesn't write
标签: java netty