我正在编写一个客户端Java程序,需要知道用于连接(通过tcp)到远程服务器的本地IP地址。
问题是调用Socket.getLocalAddress()。getHostAddress()错误地返回(仅在少数情况下)127.0.0.1,而在大多数情况下/ PC它工作正常......
以下是所用代码的片段:
public static String getLocalIPAddress(String serverIP, int port) throws UnknownHostException
{
System.out.println("Executing getLocalIPAddress on "+serverIP + ":" + port);
InetAddress inetAddress = InetAddress.getLocalHost();
String ipAddress = inetAddress.getHostAddress();
try {
Socket s = new Socket(serverIP, port);
ipAddress = s.getLocalAddress().getHostAddress();
System.out.println("Local IP : "+s.getLocalAddress().getHostAddress());
s.close();
} catch (Exception ex) {}
return ipAddress;
}
我在后续案例中获得的输出是
Executing getLocalIPAddress...
Executing getLocalIPAddress on 1.2.3.4:80
Local IP : 6.7.8.9
我在失败案例中获得的输出是
Executing getLocalIPAddress...
Executing getLocalIPAddress on 1.2.3.4:80
Local IP : 127.0.0.1
请注意,在失败的情况下,它没有经历异常。
非常感谢任何建议。
答案 0 :(得分:0)
Socket.getLocalAddress()
返回套接字绑定的本地地址。所以“127.0.0.1”表明套接字与loopback接口有关。类似地,“6.7.8.9”表示套接字被绑定到客户端的另一个接口,其地址为“6.7.8.9”。
在客户端指定用于绑定的本地地址和端口的一种方法是使用the following constructor
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
在您提供的示例中,您可以使用
Socket s = new Socket(serverIP, port, InetAddress.getLocalHost(), 0);
为客户端套接字绑定指定本地主机IP地址(而不是环回地址)。我已经测试了上面的例子,但它确实有用。