【问题标题】:How to get remoteAddress() of NIO DatagramChannel如何获取 NIO DatagramChannel 的 remoteAddress()
【发布时间】:2015-07-07 23:14:14
【问题描述】:

我正在编写一些使用 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,因为我没有配置它。那么如何确定这个数据包的来源呢?

【问题讨论】:

    标签: java nio


    【解决方案1】:

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

    【讨论】:

    • 其实receive方法返回的是地址。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      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);
      

      【讨论】:

        猜你喜欢
        • 2011-11-24
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 2014-11-01
        • 2016-05-15
        • 2023-03-23
        相关资源
        最近更新 更多