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

Posted

技术标签:

【中文标题】getLocalAddress 在连接的套接字上返回 127.0.0.1【英文标题】:getLocalAddress returns 127.0.0.1 on connected socket 【发布时间】:2013-09-02 02:44:43 【问题描述】:

我正在编写一个客户端 Java 程序,它需要知道用于(通过 tcp)连接到远程服务器的本地 IP 地址。

问题是调用 Socket.getLocalAddress().getHostAddress() 错误返回(仅在少数情况下)127.0.0.1,而在大多数情况下/PC 中它工作正常...

这里是所用代码的sn-p:

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

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

非常感谢任何建议。

【问题讨论】:

你的意思是Local IP:...后面应该跟去link一样的东西吗? 远程地址是否远程?还是 127.0.0.1?我建议您将远程地址与本地地址一起打印出来。如果它们都是 127.0.0.1 则没有问题要解决。 是的本地地址是 6.7.8.9 而远程地址是 1.2.3.4 【参考方案1】:

Socket.getLocalAddress() 返回套接字绑定的本地地址。所以“127.0.0.1”表明套接字绑定到环回接口。同样,“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 地址(而不是环回地址)。我已经测试了上面的例子,它可以工作。

【讨论】:

没有必要指定本地绑定地址,除非您有一些必须手动执行的奇怪路由,例如一个***。这个套接字绑定到 127.0.0.1 的事实实际上并不是一个问题。 我同意,但问题发布者似乎担心使用环回地址进行绑定。如果可以为实际场景提供更多信息,那就太好了。 看起来一点也不像。他没有尝试指定本地绑定地址。他只是出于某种原因担心他默认获得的绑定地址。 我要解决的问题是获取用于连接远程服务器的本地IP地址。我不是在寻找指定任何特定的 IP 地址,无论系统决定使用什么对我来说都很好,但我想知道那个地址是什么,有时它会返回 127.0.0.1

以上是关于getLocalAddress 在连接的套接字上返回 127.0.0.1的主要内容,如果未能解决你的问题,请参考以下文章

如何找到连接到服务器的客户端的 IP 地址?

Java如何在指定端口创建套接字?

套接字是不是在重新连接事件中重用?

在 Python 中打开 SSL 套接字连接

如何确定客户端连接是不是在 Java 服务器的 TCP 套接字连接中终止?

在套接字连接中具有交换密钥的 Java RSA