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),而是数据报本身,这是有效载荷。有效负载在 netty MessageEvent中传递,如果您调用MessageEvent.getRemoteAddress(),它会返回您想要的内容。

于 2013-03-01T17:04:07.297 回答
0

目前尚不清楚(至少对我而言)您所引用的 ChannelHandlerContext 类是什么。

如果使用 DatagramSocket[1],则可以使用 receive[1] 方法读取 UDP 数据包。如接收方法 [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 回答