在服务器套接字端如何获取客户端的IP地址和端口号?

3
我有一个基于Java的Socket监听器运行在桌面端,我有一个移动客户端,可以与这个Socket服务器连接而没有任何问题。当客户端试图访问新连接时,我希望为每个客户端单独建立套接字连接。我从这个链接中了解到了如何区分多个连接:多连接检测的参考链接
根据在Socket服务器上检测到的客户端连接的IP和PORT,以及每个连接的不同之处,可以区分多个连接。每个连接的客户端PORT将不同。我读到了可以调用getpeername来获取Socket服务器端上客户端连接的IP和PORT。但是,在Java中我没有看到任何可用的API,然后找到了下面这个。
ServerSocket server = new ServerSocket(8080);
System.out.println("server.getInetAddress();: " + server.getInetAddress());

但是,当移动客户端(模拟器)调用此套接字时,它始终返回server.getInetAddress():- 0.0.0.0/0.0.0.0

有人能向我提供建议吗?为什么我在套接字端没有获取到客户端的IP和端口使用上述InetAddress API?还是我需要使用不同的方法?

1个回答

10
当服务器接受连接时,您会获得代表该连接的Socket。Socket具有一个getInetAddress()方法,该方法将返回远程地址,以及相应的getPort()方法,该方法将返回远程端口。

例如:
Socket newSock = s.accept();
InetAddress addr = s.getInetAddress();
int         port = s.getPort();

然而,需要注意的是,您获取到的IP地址可能并不是真实客户机的IP地址。请考虑NAT情况和HTTP代理情况。 - undefined
当然,它是您连接的外部可见地址,可能是NAT网关或代理。那些背后的地址无论如何都不可路由。 - undefined
嗨Jim,非常感谢!我尝试了使用"int port = server.getLocalPort()"而不是"s.getPort();"。我正在同一台机器上进行测试,我在那里有移动客户端模拟器和socket也在运行,所以结果是"addr: 0.0.0.0/0.0.0.0 port: 8080 "像这样...我想,我必须使用真实的物理移动设备进行测试,这样我才能正确获取客户端的实际IP和端口,我猜应该是这样。 - undefined
它正常工作了。当我尝试从不同的移动设备客户端访问这个套接字时,它会给出不同的客户端IP地址。但是,无论我是从iOS、Android等不同的移动客户端尝试,我总是得到相同的客户端端口8080。有什么想法是什么原因呢?也许手机都连接在同一个无线网络上了? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接