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