2013-08-29 36 views
2

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

的问题是,呼叫Socket.getLocalAddress()。getHostAddress()返回错误(只在少数情况下)127.0.0.1,而在大多数情况下/电脑的正常工作......

下面是代码的使用的片段:

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 

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

任何意见是非常感激。

+0

你的意思是本地IP地址:...应该跟随同样的事情,就像你去[link](http://www.whatismyip.com)一样? – lukey

+1

远程地址是否为远程地址?或者它是127.0.0.1?我建议你打印出远程地址和本地地址。如果它们都是127.0.0.1,这里没有问题要解决。 – EJP

+0

是本地地址是6.7.8.9,而远程地址是1.2.3.4 – MDot

回答

0

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地址(而不是回送地址)用于客户端套接字绑定。我已经测试了上面的例子,它的工作原理。

+0

除非你有一些奇怪的路由必须手动完成,否则指定本地绑定地址没有意义。一个VPN。事实上,这个套接字绑定到127.0.0.1实际上并不是一个问题。 – EJP

+0

我同意,但似乎问题海报关心使用环回地址进行绑定。如果可以为实际情况提供更多信息,那将会很好。 – btcc

+0

似乎并不是这样。他不是试图指定一个本地绑定地址。他只是因为某些原因而担心他默认获取的绑定地址。 – EJP

相关问题