6

我对 Netty 很陌生,但是当几个协议(例如 P1 和 P2)被封装在另一个协议中时,如何在 Netty 4.x 中实现一个案例?

              +-------------+
              |   decoder   |
              +-------------+
              |   encoder   |
              +-------------+
              |    muxer    |
              +-------------+
              |   demuxer   |
              +---+------+--+
                  |      |
                  |      |
           +------+      +------+
           |                    |
           |                    |
           v                    v
    +-------------+      +-------------+
    | P1 decoder  |      | P2 decoder  |
    +-------------+      +-------------+
    | P1 encoder  |      | P2 encoder  |
    +-------------+      +-------------+
    | P1 handler  |      | P2 handler  |
    +-------------+      +-------------+

有没有办法创建嵌套管道,以便decoder<->encoder<->muxer<->demuxer作为主管道将根据解复用器的决定沿 P1 或 P2 管道发送数据?

或者也许有一种方法可以用自己的管道以某种方式创建(为了清楚起见)“子通道”?

4

2 回答 2

2

尚不支持“嵌套管道”。它可能是 4.1.0 的一部分。现在,您需要动态删除/添加处理程序。

有关示例,请参见 [1]。

[1] https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/portunification/PortUnificationServerHandler.java

于 2013-03-20T07:44:50.807 回答
0

我将以下评论添加到https://github.com/netty/netty/issues/8544

我有一个建议,如何在当前和旧版本的 netty 中实现这一点。

基本思想是定义一个单一的“前端”管道来处理真正的套接字和 I/O,包括编码/解码。然后,将为各种相关协议调用不同的“后端”管道(甚至对于应用层可以在单个连接上运行独立会话的协议,甚至是单独的“会话”)。因此,后端管道是特定于协议或会话/对话的,前端更通用,并且映射到下游的单个真实网络连接,并且知道如何从上游的多个后端通道中实例化、检索和选择。

我在 Netty 中看到了两个潜在的抽象级别,其中前端和后端管道之间的这种区别可能是可能的:

  1. 最可行的(也是重量级的)是为每个后端管道声明一个完整的其他 Bootstrap。这些后端引导程序必须绑定到一个自定义的“虚拟套接字”,该套接字实际上由“前端”网络管道支持。换句话说,虚拟套接字不直接映射到 TCP 连接或主机/端口,而是进一步区分端点(主机、端口和协议或会话),但它保持对单个特定“前端”的引用。 end' 调用它的通道/管道。

  2. 一个不太重要的选项可能是在现有引导程序中以某种方式实例化(以及存储和检索)新通道。我几乎还没有开始研究这是多么可行。必须首先回答以下问题(可能还有其他我没有想到的问题):

  • 可以在管道中实例化新通道,但将其添加到事件执行器中吗?
  • 后端通道是否应该在单独的事件执行器池中运行?
  • 如何从前端实例化、存储和检索后端通道的实例
  • 后端通道仍必须使用与选项 1 相同的虚拟套接字概念
  • 渠道/渠道管道可以移交给其他渠道吗?
  • 然后这些后端通道可以写回调用它们的同一个前端通道吗?前端通道必须将回调(或对自身的引用)传递给后端通道。大概这个引用应该由虚拟套接字管理/持有。
于 2020-10-09T04:00:23.393 回答