5

UDP Netty ベースのサーバーを使用しています。メソッドをオーバーライドするSimpleChannelUpstreamHandlerパイプラインがあります。messageReceived

時々、いくつかの情報を書き戻す必要があります。からのソケット情報MessageEvent.getRemoteAddress()と からのチャネルを使用することによってのみ、これを行うことができましたMessageEvent.getChannel()。この情報を再利用できるようにするために、静的マップに保持しています。

これはMessageEvent.getChannel().write("foo", MessageEvent.getRemoteAddress());

私が期待していMessageEvent.getChannel().getRemoteAddress()たのは、仕事があることでしたが、そうではありませんでした。それはいつも私に与えますnull

  1. 私は何か間違っていますか?
  2. 一部のメンバーにチャネルとリモートアドレスを保持するよりも、書き戻すためのより良い方法はありますか?
4

3 に答える 3

5

UDP (データグラム) チャネルをサーバー チャネルとして使用する場合、それをローカル アドレスにバインドするだけで、接続は確立されません。これが、チャネルに関連付けられたリモート アドレスがなくnull、呼び出し時に常に取得する理由ですMessageEvent.getChannel().getRemoteAddress()。この動作は予期されたものであり、正しいものです。同じ単一の UDP「サーバー」チャネルがすべての着信クライアント要求を処理します。

UDP チャネルをクライアント チャネルとして使用する場合、チャネルをリモート アドレスに接続することで「接続」を作成できます。この場合、チャネルには構成されたリモート アドレスがあり (実際の接続は行われません)、呼び出しMessageEvent.getChannel().getRemoteAddress()によって構成されたリモート アドレスが返されます。UDP チャネルを接続すると、ユーザーはそのチャネルを使用して、チャネルで構成されたアドレス以外のリモート アドレスにデータを送信できなくなります。そうしようとすると、例外がスローされます。クライアント チャネルの接続は UDP ではオプションです。クライアントは、リモート アドレスを保存している限り、ローカル アドレスにのみバインドされているチャネルで適切に動作できます。

次の 2 つのオプションがあると思います。

  1. クライアントのリモートアドレスをクライアント識別子とともに保存し、「サーバー」チャネルを使用してデータを送信します。すべてのクライアントとの通信に同じチャネルが使用されるため、チャネルを保存しても機能しません。
  2. クライアントごとに新しい接続チャネルを作成し、新しいチャネルをクライアント識別子とともに保存します。

最初のオプションの方が優れていると思います。

于 2013-07-05T15:19:29.650 に答える