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 では、次の 2 つの抽象化レベルが考えられます。

  1. 最も実行可能な (そして重い) 方法は、バックエンド パイプラインごとに別の Bootstrap 全体を宣言することです。これらのバックエンド ブートストラップは、実際には「フロントエンド」の netty パイプラインによってサポートされるカスタムの「仮想ソケット」にバインドする必要があります。言い換えると、仮想ソケットは TCP 接続またはホスト/ポートに直接マップされるのではなく、エンドポイントのさらなる区別 (ホスト、ポートおよびプロトコルまたはセッション) ですが、単一の特定の「フロント」への参照を維持します。 end' を呼び出したチャネル/パイプライン。

  2. より軽量なオプションは、既存のブートストラップ内で新しいチャネルを何らかの方法でインスタンス化 (および保存および取得) することです。私は、これがどれほど実現可能かを調査し始めたばかりです。次の質問 (およびおそらく私が思いもよらなかった他の質問) に最初に回答する必要があります。

  • パイプライン内で新しいチャネルをインスタンス化して、イベント エグゼキュータに追加することはできますか?
  • バックエンド チャネルは別のイベント エグゼキュータ プールで実行する必要がありますか?
  • フロントエンドからバックエンド チャネルのインスタンスをインスタンス化、保存、取得する方法
  • バックエンド チャネルは、オプション 1 と同じ仮想ソケットの概念を引き続き使用する必要があります。
  • チャネル/チャネル パイプラインは他のチャネルにハンドオフできますか?
  • これらのバックエンド チャネルは、それらを呼び出したのと同じフロントエンド チャネルに書き戻すことができますか? フロントエンド チャネルは、コールバック (またはそれ自体への参照) をバックエンド チャネルに渡す必要があります。おそらく、この参照は仮想ソケットによって管理/保持されるべきです。
于 2020-10-09T04:00:23.393 に答える