gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:43:47 24 4
gpt4 key购买 nike

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

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

非常感谢任何建议。

最佳答案

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

在客户端指定用于绑定(bind)的本地地址和端口的一种方法是使用 the following constructor

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

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

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

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

关于java - getLocalAddress 在连接的套接字上返回 127.0.0.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com