2016-08-08 24 views
0

たとえば、websocketサーバーを構築する場合は、initChannelメソッドに何を入れるべきかと思います。それから私は、私は次の操作を実行する必要のあるネッティーのソースコード、中のWebSocketの例が見つかりました:Nettyチャネルパイプラインでのアクションの順序を決定する方法

public void initChannel(final SocketChannel ch) throws Exception { 
       ch.pipeline().addLast(
        new HttpRequestDecoder(), 
        new HttpObjectAggregator(65536), 
        new HttpResponseEncoder(), 
        new WebSocketServerProtocolHandler("/websocket"), 
        new CustomTextFrameHandler()); 
      } 

をしかし、私はこのような順序でオブジェクトを配置する必要がある理由はわかりません。 HttpObjectAggregatorの説明では、私はこのようなものが見つかりました:

Be aware that you need to have the {@link HttpResponseEncoder} or {@link HttpRequestEncoder} before the {@link HttpObjectAggregator} in the {@link ChannelPipeline}.

をしかし、上記のコードでHttpObjectAggregatorオブジェクトがHttpResponseEncoderオブジェクトの前にあります。私は混乱しています。私はこれらのオブジェクトを正しい順序で入れていることをどのように知っていますか?

答えて

1

TLDR;物事を単純にするために、HttpServerCodecをinitメソッドに入れる必要があります。アグリゲーターを使用する場合は、HttpObjectAggregatorの前に行います。

HttpObjectAggregatorの前にエンコーダを置くことについてのアドバイスが誤植であることは間違いありません。エンコーダは、アウトバウンドのみのハンドラであり、HttpObjectAggregatorはインバウンドハンドラです。これは、イベントが両方とも相互作用しないことを意味します。相対的な順序が重要であることは意味を持たない。ここで

警告はHttpObjectAggregatorがある場合には(主に100 CONTINUE)HttpObjectsを記述します、そしてそのためHttpObjectそれは、それの前にHttpResponseEncoder必要ワイヤ上で送信することができるバイト[]に変換することですパイプライン。発信時にパイプラインは逆方向に横断されるため、エンコーダはアグリゲータによって送信されたメッセージを受信しますが、エンコーダは送信しません。あなたが掲示したサンプルコードには、100 CONTINUEを送る必要がある場合にのみヒットするバグがあります。エンコーダ/デコーダをアグリゲータの前のHttpServerCodecに置き換えることでバグが修正されたようです。 HttpRequestDecoderまたはHttpResponseDecoderなどの

デコーダは、インバウンドのみハンドラである、と彼らはそれが正しく機能するためにHttpObjectAggregator前にする必要があります。これは、2つのデコーダがbyte[]HttpObjectに変換するのに対し、HttpObjectAggregatorは実際にはHttpObjectFullHttpMessageに変換するMessage to Messageデコーダであるからです。

Nettyは、1つのクラスでHttpRequestDecoderとHttpResponseEncoderを組み合わせたHttpServerCodecを導入しました。あなたのアグリゲーターの前にそれを置くならば、あなた自身のコード行を保存し、あなたのサーバー用の適切なエンコーダーとデコーダーがあることを確認してください。

メッセージが発信ハンドラ対インバウンドのためのパイプラインでどのように機能するかを理解する上で良い参考:この文言が最初に導入されたhttps://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html

号(のみデコード、エンコードの言及に気付かない):https://github.com/netty/netty/issues/2401

問題この文言は誤字/バグとして指摘されています:https://github.com/netty/netty/issues/2471

+0

うわー私はこのテーマについて詳しくは分かりませんでした。文書を読むだけでは不十分ですが、問題のリストもあります。コードを読むだけでなく、Nettyをもっと素早く学ぶ良い方法はありますか?あなたが見ることができるように、私は幸運なら1週間後にstackoverflowから私の質問の答えを得る。 – newguy

関連する問題