2013-08-29 38 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

相關問題