2012-07-21 61 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 

准确地给出上述症状。