当前位置: 首页 > 面试题库 >

净额不写

仲绍晖
2023-03-14
问题内容

Wireshark确认,当尝试使用netty进行写入时,写入的数据永远不会在远端结束。

我努力了:

//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);

获得异常的根本原因后,可能会出现多个问题:

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

注意:
使用时也会抛出此错误ObjectEncoder,但您的对象未实现Serializable

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

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

通常使用以下处理程序:

转换String用途StringEncoder
转换Serializable用途ObjectEncoder(警告,与普通Java对象流不兼容)转换byte[]用途ByteArrayEncoder

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



 类似资料:
  • 我正在处理一个需要单点登录的项目。系统A在数据库中查找用户名和密码,系统B仅使用SAML 2.0进行身份验证。在这种情况下,系统B将是服务提供商(SP)。我对SAML SSO相对较新,所以我不能100%确定我的方法是正确的。我猜系统A必须是IDP。用户将登录系统A,并在成功登录后将更多信息发布到系统B以完成SSO过程。这是否准确?

  • 我需要与GitHub集成API进行交互,但具体是从。NET 4.0,所以我不能使用Octokit。 基本上,我得到了一个格式化的私有rsa密钥(标准不支持。NET API),并且必须发送RS256 jwt令牌才能获得与API交互的身份验证令牌。 提供了以下ruby示例代码: 使用下面的curl示例 以及以下Result示例:

  • 我创建了一个构建html字符串作为电子邮件正文的代码。然而,我希望这封电子邮件是我的一般和基础电子邮件,我在第一个地方创建的附件。下面的代码实际上是有效的,但在最后,当我打开我的普通电子邮件时,我将第二封电子邮件作为附件,但当我单击它时,附件中的电子邮件是Black电子邮件。尽管我创建了html主体,但结果仍然如此。html字符串在最后一个方法“AddMessageAsAttachment”的末尾

  • 我想了解Netty频道选项“WRITE_SPIN_COUNT”的用法。将此值设置为高于或低于默认值(16)的效果是什么。这个应该设置吗。?这是我从Netty文档中获得的信息,但不清楚为什么以及何时应该设置此值:http://netty.io/4.0/api/io/netty/channel/DefaultChannelConfig.html#getWriteSpinCount()根据文档说明:返回

  • 问题内容: 您好,我有一个带有处理程序的Netty Server,该处理程序应接受字符串。似乎最多只能接收1024个字节的内容。我如何增加缓冲区大小。我已经尝试过 没有成功。 处理程序如下 } 问题答案: 您正在使用UDP吗?如果是这样,数据包将最大为1024字节。此代码注释在QOTM代码示例中: 允许的数据包最大为1024字节(默认值为768)。您可以增加或减小此值,以避免数据包被截断或分别改善

  • 我正在用纯javascript为.NET 6中的最小API发出请求,但是当我在浏览器中打开它时,我收到以下消息: “获取”的访问权限https://localhost:7252/v1/todosCORS策略已阻止“来自源”的“null”:请求的资源上不存在“访问控制允许源”标头。不透明响应满足您的需求,将请求的模式设置为“无cors”以获取禁用cors的资源。 我已经在API中添加了CORS配置,