2

我正在使用 NIO 编写一些客户端代码来侦听来自多个服务器的 UDP 数据包(其中许多被配置为回复同一个端口)。我尝试为每个已知服务器NIO 设置专用通道失败了。2 个客户端绑定到同一个端口,只有 1 个可以读取

所以我现在试图绑定到一个端口而不指定目的地

DatagramChannel channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.socket().bind(new InetSocketAddress(port));

我的选择器现在成功接收到从我的所有服务器定向到此端口的所有 UDP 数据包

...    
  SelectionKey selKey = it.next();
  if (selKey.isValid() && selKey.isReadable()) {
    DatagramChannel sChannel = (DatagramChannel) selKey.channel();
    sChannel.getRemoteAddress();//My problem lies here
 ....

正如预期的那样 sChannel.getRemoteAddress() 返回 null 因为我没有配置它。那么如何确定这个数据包的来源呢?

4

3 回答 3

1

DatagramPacket 的源地址在数据包中。请参阅 Javadoc。或者,如果您连接 DatagramChannel 或其底层 DatagramSocket,您可以从那里获取它……但不是其他方式。

于 2013-02-11T08:35:25.687 回答
1

要获取发送者的远程地址,您需要执行如下数据接收:

if (key.isReadable()) {
    ByteBuffer byte_buffer = ByteBuffer.allocate(buffer_size);
    InetSocketAddress remote_address = (InetSocketAddress) ((DatagramChannel)key.channel()).receive(byte_buffer);
    byte_buffer.flip();
}

如您所见,DatagramChannel类的接收方法返回发送者的地址。

于 2014-03-22T20:34:49.077 回答
1

getRemoteAddress() 将在 DatagramChannel 连接上返回 null。

我使用了以下代码:

//Declare the client address to be any random value, Just for initialization                
InetSocketAddress clientAddress = new InetSocketAddress("127.0.0.1",1000);
//Declare the clientaddress' buffer 
ByteBuffer buffer = ByteBuffer.allocate(255);
// Receive from the buffer
clientAddress = (InetSocketAddress)clientChannel.receive(buffer);
//This address is retained by masking receive 
System.out.println("Client address : " + clientAddress);
于 2015-07-07T15:14:14.967 回答