3

現在、コネクションレス サーバーを作成しており、各 udp パケットのリモート IP アドレスを知りたいです。

そうするために、私は使用します

addr = ((InetSocketAddress)ctx.getChannel().getRemoteAddress()).getAddress();

次のような私のチャネルハンドラで

public void messageReceived(ChannelHandlerContext ctx, MessageEvent ev) throws Exception 

しかし、NullPointerExceptionが出てしまいます。私の推測では、コネクションレス チャネルが原因で、各 udp パケットを受信した後にチャネルが閉じられています。

この場合、どうすれば知ることができますか?

ありがとう〜

4

2 に答える 2

5

同じことに気づきました。チャネルはリモートアドレスを提供しませんが、それについて考えると、リモートアドレスについてさえ知っているのはチャネル(またはそれがラップするDatagramSocket)ではなく、Datagram自体は知っています。これがペイロードです。ペイロードはnettyMessageEventで配信され、MessageEvent.getRemoteAddress ()を呼び出すと、必要なものが返されます。

于 2013-03-01T17:04:07.297 に答える
0

あなたが参照している ChannelHandlerContext クラスが何であるかは(少なくとも私には)明確ではありません。

DatagramSocket[1] を使用すると、receive[1] メソッドを使用して UDP パケットを読み取ることができます。receive メソッド [2] で説明されているように、DatagramPacket[3] には送信者の IP アドレスとポート番号が含まれます。

[1] - http://docs.oracle.com/javase/6/docs/api/java/net/DatagramSocket.html [2] - http://docs.oracle.com/javase/6/docs/api /java/net/DatagramSocket.html#receive(java.net.DatagramPacket) [3] - http://docs.oracle.com/javase/6/docs/api/java/net/DatagramPacket.html

于 2013-03-01T16:22:54.413 に答える