【问题标题】:Customize Pipeline Creation in Netty在 Netty 中自定义管道创建
【发布时间】:2014-09-21 12:12:47
【问题描述】:

我正在尝试创建一个拥有 Netty 客户端连接的类,并且能够接收所有通道事件,例如 channelActive、exceptionCaught 和 channelRead,就像它在管道末端一样。

我的班级可以通过调用这样的方法来创建客户端 TCP 连接:

ChannelFuture cf = bootstrap.connect(address, port);

我想知道是否需要在创建通道时将我的类插入通道管道的末尾,但我不确定如何在不丢失任何事件的情况下执行此操作(即来自远端)。通道管道是根据引导程序的配置方式创建的,因此我看不到如何安排最初将我的类添加到管道中。

我可以等待建立连接,然后执行以下操作:

cf.get().pipeline().addLast(this);

但我不确定在这种情况下我的班级是否会尽快添加到管道中。例如,如果我这样做,我还会看到 channelActive 事件吗?

【问题讨论】:

    标签: netty


    【解决方案1】:

    抱歉,如果您已经知道以下想法,但如果您不知道,那么可能会有所帮助(引述来自 Manning 的书 Netty in Action,这是一本了解 Netty 一切的好书):

    • 拥有引导程序的类通常具有处理程序配置 - 通常是初始化程序
    • 对于 ServerBootstrap,它用于面向连接的协议,例如 TCP 上的某些东西,可以使用处理程序和子处理程序

    "ServerBootstrap 引导 ServerChannel 实现,它们负责创建子 Channels...当一个新的连接被接受时,一个新的子 Channel 将被创建并且 ChannelInitializer 将添加一个我们的 [handler] 的实例到Channel 的 ChannelPipeline。”

    • 当您初始化通道管道时,您会设置日志处理程序、解码器/编码器、请求/响应的处理程序顺序,包括用于 ssl/分块文件处理等的任何花哨的类
    • 请求/响应处理程序通常包含或使用其他持有业务逻辑的类
    • 您可以从管道中动态添加/删除处理程序(例如将管道从 HTTP 升级到 WebSockets)
    • 如果你想拉出一条消息/把一条消息放在管道中间的某个地方,Netty 可以在 ChannelHandlerContext 而不是管道上操作

    有很多很好的例子可供参考:

    • Netty 源代码有一个示例文件夹
    • GitHub 上的 NettyInAction 有书中的示例
    • Heiko Rupp's blog 有一些易于理解的示例

    【讨论】:

      【解决方案2】:

      如果您在通道初始化程序中添加处理程序,它将获取所有事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        相关资源
        最近更新 更多