为什么java rmi保持连接到127.0.1.1。 当IP是192.168.XX?

我有一个简单的Java rmi应用程序:

客户:

Registry registry = LocateRegistry.getRegistry("localhost"); costApi = (CostApi) registry.lookup("server.CostApi"); 

当我在localhost托pipe服务器时,一切正常。 当我在本地networking的另一台机器上启动相同的程序时,在192.168.xx并更改为:

客户:

 Registry registry = LocateRegistry.getRegistry("192.168.xx"); costApi = (CostApi) registry.lookup("server.CostApi"); 

它不工作了,它失败了一个非常奇怪的错误:

 java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: java.net.ConnectException: Connection refused at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194) at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148) at com.sun.proxy.$Proxy0.dataCost(Unknown Source) at billing.data.DataBiller.performBilling(DataBiller.java:57) at billing.data.DataBiller.consumeMessage(DataBiller.java:46) at general.templates.RabbitWorker.run(RabbitWorker.java:124) at java.lang.Thread.run(Thread.java:744) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) 

我甚至不试图连接到127.0.1.1,但是到192.168.xx,我该如何解决这个问题? 我更喜欢使用java代码,而不是用configuration文件修改我的机器。 我正在使用Linux

这通常是由错误配置造成的。 检查你的/etc/hosts文件以确保:

  • localhost映射到127.0.0.1
  • 您的真实主机名映射到您的真实主机地址

一些Linux发行版已经知道这一点。

如果问题仍然存在,请尝试将服务器上的java.rmi.server.hostname设置为客户端在执行远程方法调用时应使用的IP地址。 在导出任何远程对象(包括注册表)之前,需要设置它。

这个问题是由嵌入在存根中的IP地址引起的,最终来自像InetAddress.getLocalAddress(),这样的错误。 它被java.rmi.server.hostname.覆盖java.rmi.server.hostname.

这是FMI FAQ中的项目A.1 ,但请注意,该项目是无效的。 在lookup()过程中不会发生这种情况,当您在结果存根上调用远程方法时,就会发生这种情况。

我刚刚遇到了同样的问题。 我正在做一些与你正在做的事非常相似的事情。 我注意到的是,我第一次运行客户端程序,并且失败了(通过设计防火墙测试) – 它失败了,显示了我最初指定的主机的实际IP地址(192.168.xx地址),但随后的所有故障都表明它无法连接到127.0.0.1。 目前我怀疑在客户端上的某种缓存 – 有JVM标记的IP地址再也不能访问,它拒绝再次尝试连接到它?

更新:在我的情况下,RMI服务器端的JVM无法在JVM启动时正确设置java.rmi.server.hostname属性。 此属性被保留为空。 当客户端连接到特定的RMI注册表并要求存根到特定的命名对象时,它们会收到一个存根,其中包含可以找到实际对象的远程机器的ip地址。 RMI服务器将java.rmi.server.hostname属性的内容复制到它返回给客户端的存根中,所以如果java.rmi.server.hostname属性是“”,并将其复制到它创建的每个存根,每个存根包含对IP地址为“”的远程服务器的引用。 默认情况下,客户端jvm通过尝试连接到本地主机127.0.0.1上的服务器对象来做出反应。 要解决该问题,请在导出服务器端的任何远程对象之前尝试以下代码行:

 System.setProperty( "java.rmi.server.hostname", "192.168.RMIserver.IP" ) ; 

该属性将被自动复制到该服务器上导出的所有远程存根,接收该存根的客户端应能够到达远程服务器(假设任何防火墙配置正确)。