如何获取NIO DatagramChannel的remoteAddress()

时间:2013-02-11 08:30:08

标签: java nio

我正在使用NIO编写一些客户端代码来侦听来自多个服务器的UDP数据包(其中许多服务器配置为回复同一个端口)。我尝试为每个已知服务器NIO. 2 clients binding to same port, only 1 can read设置专用通道时失败了。

所以我现在尝试绑定到端口而不指定目标

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,因为我没有配置它。那么如何确定此数据包的来源?

3 个答案:

答案 0 :(得分:1)

DatagramPacket的源地址在数据包中。见Javadoc。或者,如果您连接DatagramChannel或其基础DatagramSocket,您可以从那里获取它......但不是。否则。

答案 1 :(得分: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 类的方法会返回发件人的地址。

答案 2 :(得分: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);