任何人都知道,虽然我已经改变了里面的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。谢谢!
任何人都知道,虽然我已经改变了里面的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。谢谢!
,因为你必须重新启动电脑或清除DNS缓存,以“应用”更改
感谢您的回复。我已经重新启动服务器并使用以下命令清除缓存:service nscd restart。但它仍然是一样的。 – Jingwei 2012-07-21 14:42:44
这可能是一个安全限制问题。从javadoc:
如果有安全管理器,其checkConnect方法被调用 本地主机名和-1作为参数,看是否操作 允许的。如果该操作不被允许,则返回代表 的InetAddress返回的环回地址。
感谢您的回复。你知道我如何能够检查安全限制吗? – Jingwei 2012-07-21 14:43:42
@景威:关于安全经理的[此](http://docs.oracle.com/javase/tutorial/essential/environment/security.html)链接可能对您有所帮助。 – Keppil 2012-07-21 14:50:52
谢谢@Keppil。我正在命令行运行rmi测试用例,以尽量减少任何容器的影响。根据链接'通常,一个Web小应用程序与浏览器或Java Web Start插件提供的安全管理器一起运行。其他类型的应用程序通常在没有安全管理器的情况下运行,除非应用程序本身定义了一个。“我不应该使用任何安全管理器。为了确认这一点,我检查了'System.getSecurityManager()'的值,它返回null。因此,我不会因为SecurityManager而减少它。 – Jingwei 2012-07-21 15:12:53
首先本地主机将始终表示回送地址127.0.0.1的(这是用来 调试TCP/IP堆栈。)当保安经理创立该操作是不允许的。
为您的局域网地址使用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());
}
}
感谢您的回复。问题是它是Java的RMI实现的一部分,我无法改变。 – Jingwei 2012-07-21 14:45:04
一个老问题,但也许这个信息将有助于别人 - 我一直在努力寻找任何地方(记录的信息,也许是因为它不是一个语言规范的正式部分),并且必须通过实验来确定。
如果问题不下来到安全管理器,那么最有可能的问题是,在操作系统级别名称解析由于某种原因搞砸了。
至少在我已经上(OS X,Solaris和Linux)的所有测试的Unix平台,通过Java中使用的过程是:
我看到由严重配置的/ etc /主机这打破,如:
127.0.0.1 localhost myhost
1.2.3.4 myhost
准确地给出上述症状。
你重新启动网络服务? – Jeshurun 2012-07-21 14:22:42
感谢您的回复@Jeshurun。我重新启动了服务器。 – Jingwei 2012-07-21 15:15:17