当前位置: 首页 > 知识库问答 >
问题:

数据如何通过管道从处理程序传递到处理程序 netty

阴飞星
2023-03-14

我试图通过“网络在行动”这本书来掌握网络概念。

在我看来,有几个概念解释得不太好或太模糊。因此,我想我会来这里就这些话题做一些明确的解释。

渠道管道:

所以我有一个这样的渠道管道:

@Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        pipeline.addLast("decoder", new decodeHandler());
        pipeline.addLast("encoder", new encodeHandler());
        pipeline.addLast("timeout", new IdleStateHandler(60, 0, 0));
        pipeline.addLast("handler", handler);
    }

对于channelInitializer,从概念上讲,我会假设该过程将按以下顺序进行:

解码器 -

为什么处理程序在管道的最后?这是因为编码器对消息进行编码,处理程序对其进行处理并将其推送到上游/客户端吗?

频道处理程序:

对我来说,这是整个网络中最令人困惑的部分。因此,使用解码器,netty 书对解码参数的解释如下:

这是您必须实现的唯一抽象方法。使用包含传入数据的ByteBuf和添加解码消息的List调用decode()。重复此调用,直到确定没有新项添加到List或ByteBuf中没有更多字节可读。然后,如果List不为空,则将其内容传递给管道中的下一个处理程序。

这一切对我来说都是有道理的。但是,令人困惑的部分是最后一句话。内容究竟如何传递到下一个处理程序?例如,我看到通道处理程序上下文写入数据,如下所示:

ctx.channel().alloc().write(response)

然而,然后我们也这样做

out.add(new Response());

我不知道为什么我们直接写入通道,有时会将可读对象添加到out列表变量中。

所以我的问题是,我们什么时候写入绑定到上下文的通道(即ctx.channel(). write(),而不是通过out变量传递数据。因为我在代码中看不到out变量被传递到下一个处理程序的位置。它只是将对象添加到其中,仅此而已。留档没有显示它是如何传递的。我知道管道是一个双向链接列表。所以什么代码语句会增加管道中的指针。例如,我想应该是这样的。

decode(){
   //decode message
   //increment pointer of pipeline and pass out variable to next handler (or new pointer location)
}

任何帮助和澄清都将不胜感激。


共有1个答案

隆康平
2023-03-14
匿名用户

    < li >第一个问题。什么决定了管道中处理程序的顺序?< br >当您调用< code>pipeline.addlast()向管道添加处理程序时,该处理程序将被添加到处理程序链的最后。也就是说,处理程序在链中的顺序取决于您添加它们的顺序。因此,在您的示例中,处理程序链是这样的:< br> decode -

 类似资料:
  • 我正在尝试使用动态ChannelHandler管道实现Netty 4. X。正如人们建议的“出于性能考虑,在运行时使用调用而不是管道修改”,我实现了一个Server、一个RouterInoundHander和一个Client来测试这个理论。但它不起作用。这是我的代码 计算机网络服务器 RouterInboundHandler 和客户 如代码所示,在Channel的连接初始化阶段创建了Channel

  • 问题内容: 我试图将我的数据库对象传递给我的处理程序,而不是具有全局对象。但是我不知道这是否可行,我使用的是Gorilla Mux软件包,我可以看到它把闭包作为第二个参数。 然后定义了我可以使用的参数,理想情况下,我希望拥有这样的第三个参数。 有解决方法吗?还是我需要一个全局数据库对象?我是Go的新手,所以请详细说明可能的答案。 问题答案: 欢迎来到。 可以使用全局变量,特别是数据库对象。 但是,

  • 我正在学习Netty并制作一个通过TCP发送对象的简单应用程序的原型。我的问题是,当我用我的消息从服务器端调用时,它似乎没有到达管道中的处理程序。当我从客户端向服务器发送消息时,它按预期工作。 这是代码。 服务器: 双工通道处理程序: 最后是编码器(解码器类似): 客户端: 和处理程序: 当我通过服务器端的控制台发送消息时,我得到了输出: 因此,看起来似乎在客户端发送了消息,但没有收到任何消息。

  • 问题内容: 目前,我尝试使用Go创建一个小型Web项目,以在服务器上进行数据处理。 我尝试将数据库连接传递给我的HandlerFunc(tions),但是它没有按预期工作。我对golang相当陌生,因此也许我不了解该lang的一些基本原理。 我的主要功能如下: 我的路由器: 和我的路线: 所以-如何将我的“ env”(或env.DB)传递给FuncHandlers?我尝试了很多东西,但没有一个起作

  • 问题内容: 我使用React Router的React.js应用程序具有以下结构: 我想将一些属性传递给组件。 (通常我会这样做) 用React Router做到这一点最简单,正确的方法是什么? 问题答案: 更新 自新版本发布以来,无需使用包装器就可以直接通过组件传递道具。例如,通过使用prop。 零件: 用法: 旧版本 我的首选方式是包装组件并将包装器作为路由处理程序传递。 这是您应用了更改的示

  • 问题内容: 我有一个SOAP消息处理程序,它能够获取Web服务响应的原始XML。我需要将此XML放入Web服务客户端,以便可以在响应发送之前对响应执行一些XSL转换。我在寻找一种从SOAP处理程序获取数据的好方法方面遇到了麻烦,该SOAP处理程序捕获传入的消息,并使原始XML可用于生成的(从WSDL)Web服务客户端。有什么想法甚至可行吗? 我想出了这样的东西: 在非常简单的测试中,这似乎可行。但