public class NIOUDPServer {
private int PORT=5140;
private DatagramChannel datagramChannel;
private Selector selector;
    private ByteBuffer buffer;
    private int CAPACITY=1024*100;
    
public void init() throws IOException {
selector = Selector.open();
datagramChannel = SelectorProvider.provider().openDatagramChannel();
InetSocketAddress adrress = new InetSocketAddress(InetAddress.getLocalHost(), PORT);
datagramChannel.configureBlocking(false);
datagramChannel.socket().bind(adrress);
datagramChannel.register(selector, SelectionKey.OP_READ);
buffer=ByteBuffer.allocate(CAPACITY);
} public void run() throws IOException { while (true) { if (selector.select() > 0) {
Set<SelectionKey> keys=selector.selectedKeys();
Iterator<SelectionKey> iterator= keys.iterator();
while(iterator.hasNext()){
buffer.clear();
SelectionKey key=iterator.next();
iterator.remove();
if(!key.isReadable() ){
continue;
}

datagramChannel=(DatagramChannel)key.channel();
datagramChannel.receive(buffer);

buffer.flip();
System.out.println("服务器接受到:"
                            + Charset.defaultCharset().decode(buffer)
                                    .toString());
}
} }
} public static void main(String[] args) throws IOException {
NIOUDPServer nioudpServer=     new NIOUDPServer();
nioudpServer.init();
nioudpServer.run();
}}
上面这段代码为想用来接收udp数据包,我想获取发送方的IP地址改怎么办,求大神。

解决方案 »

  1.   

    客户端发送消息时将ip地址按照一定的格式封装到信息中,然后解析服务器端的buf,取出对应的ip
      

  2.   

    翻了一下javadoc, 楼主试试
    datagramChannel.socket().getRemoteSocketAddress();
    这个属于常用的功能,应该有API直接能取到。
      

  3.   

         感谢各位的回答,目前已经解决,SocketAddress socketAddress = datagramChannel.receive(buffer);这个接收返回的是一个套接字地址,我怀着试试看的情况,将这个地址强制转换为InetSocketAddress就可以了,如下:
    String senderIp =((InetSocketAddress)socketAddress).getAddress().getHostAddress();