2

我正在编写一个客户端 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

请注意,在失败的情况下,它没有经历异常。

非常感谢任何建议。

4

1 回答 1

0

Socket.getLocalAddress()返回套接字绑定的本地地址。所以“127.0.0.1”表明套接字绑定到环回接口。同样,“6.7.8.9”表示套接字绑定到客户端的另一个接口,地址为“6.7.8.9”。

在客户端指定用于绑定的本地地址和端口的一种方法是使用以下构造函数

    Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

在您提供的示例中,您可以使用

    Socket s = new Socket(serverIP, port, InetAddress.getLocalHost(), 0);

为客户端套接字绑定指定本地主机 IP 地址(而不是环回地址)。我已经测试了上面的示例并且它有效。

于 2013-10-10T02:46:48.913 回答