2012-07-21 56 views
5

任何人都知道,雖然我已經改變了裏面的IP/etc/hosts中爲什麼InetAddress.getLocalHost()總是返回127.0.0.1?變更後InetAddress.getLocalHost()總是返回127.0.0.1

hostname -i 

返回正確的IP(192.168.x.x),但InetAddress.getLocalHost()仍然是名字。

我使用的是JDK 1.6.0_31順便說一下,在CentOS 6.2。謝謝!

+0

你重新啓動網絡服務? – Jeshurun 2012-07-21 14:22:42

+0

感謝您的回覆@Jeshurun。我重新啓動了服務器。 – Jingwei 2012-07-21 15:15:17

回答

1

,因爲你必須重新啓動電腦或清除DNS緩存,以「應用」更改

+0

感謝您的回覆。我已經重新啓動服務器並使用以下命令清除緩存:service nscd restart。但它仍然是一樣的。 – Jingwei 2012-07-21 14:42:44

1

這可能是一個安全限制問題。從javadoc

如果有安全管理器,其checkConnect方法被調用 本地主機名和-1作爲參數,看是否操作 允許的。如果該操作不被允許,則返回代表 的InetAddress返回的環回地址。

+1

感謝您的回覆。你知道我如何能夠檢查安全限制嗎? – Jingwei 2012-07-21 14:43:42

+1

@景威:關於安全經理的[此](http://docs.oracle.com/javase/tutorial/essential/environment/security.html)鏈接可能對您有所幫助。 – Keppil 2012-07-21 14:50:52

+0

謝謝@Keppil。我正在命令行運行rmi測試用例,以儘量減少任何容器的影響。根據鏈接'通常,一個Web小應用程序與瀏覽器或Java Web Start插件提供的安全管理器一起運行。其他類型的應用程序通常在沒有安全管理器的情況下運行,除非應用程序本身定義了一個。「我不應該使用任何安全管理器。爲了確認這一點,我檢查了'System.getSecurityManager()'的值,它返回null。因此,我不會因爲SecurityManager而減少它。 – Jingwei 2012-07-21 15:12:53

0
  1. 首先本地主機將始終表示回送地址127.0.0.1的(這是用來 調試TCP/IP堆棧。)當保安經理創立該操作是不允許的。

  2. 爲您的局域網地址使用InetAddress.getByName("PC NAME").getHostAddress()

    請與您的PC名稱替換計算機名稱。

如:

public class StrTest { 


    public static void main(String[] args) throws IOException { 


      System.out.println(InetAddress.getByName("Vicky-PC").getHostAddress()); 

    } 

} 
+0

感謝您的回覆。問題是它是Java的RMI實現的一部分,我無法改變。 – Jingwei 2012-07-21 14:45:04

1

一個老問題,但也許這個信息將有助於別人 - 我一直在努力尋找任何地方(記錄的信息,也許是因爲它不是一個語言規範的正式部分),並且必須通過實驗來確定。

如果問題不下來到安全管理器,那麼最有可能的問題是,在操作系統級別名稱解析由於某種原因搞砸了。

至少在我已經上(OS X,Solaris和Linux)的所有測試的Unix平臺,通過Java中使用的過程是:

  1. 確定本地主機名
  2. 解決通過/ etc /主機以確定IP地址

我看到由嚴重配置的/ etc /主機這打破,如:

127.0.0.1 localhost myhost 
1.2.3.4 myhost 

準確地給出上述症狀。