getLocalAddress在连接的套接字上返回127.0.0.1

时间:2013-08-29 15:15:26

标签: java sockets tcp ip

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

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

非常感谢任何建议。

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地址(而不是环回地址)。我已经测试了上面的例子,但它确实有用。