【问题标题】:getLocalAddress returns 127.0.0.1 on connected socketgetLocalAddress 在连接的套接字上返回 127.0.0.1
【发布时间】: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

标签: java sockets tcp ip


【解决方案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 地址(而不是环回地址)。我已经测试了上面的例子,它可以工作。

【讨论】:

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