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的主要内容,如果未能解决你的问题,请参考以下文章