首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奈蒂不写

奈蒂不写
EN

Stack Overflow用户
提问于 2016-11-29 09:28:51
回答 1查看 1.6K关注 0票数 1

当尝试使用netty编写时,所编写的数据永远不会在远程端结束,这一点得到了Wireshark的证实。

我试过:

代码语言:javascript
复制
//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();}中时,没有发现异常。

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

EN

Stack Overflow用户

回答已采纳

发布于 2016-11-29 09:28:51

Netty是异步的,这意味着它不会在写失败时抛出异常。它不是抛出异常,而是返回一个Future<?>,该Future<?>将在请求完成时进行更新。在调试的第一步中,一定要记录由此产生的任何异常:

代码语言:javascript
复制
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();
        }
    }
});

或者更简单地说:

代码语言:javascript
复制
channel.writeAndFlush(...).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);

在找到异常的根本原因后,可能会出现多个问题:

java.lang.UnsupportedOperationException:

unsupported message type: <type> (expected: ...)

注意:这在使用ObjectEncoder时也会引发,但是对象没有实现Serializable

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

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

以下处理程序是常用的:

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

注意:由于TCP是一种基于流的协议,所以通常需要附加某种形式的数据包大小,因为您可能没有收到所编写的确切数据包。有关更多信息,请参见Netty中的处理基于流的传输

票数 9
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40862160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档