【问题标题】:Why does java rmi keep connecting to 127.0.1.1. When ip is 192.168.X.X?为什么java rmi 一直连接到127.0.1.1。什么时候ip是192.168.X.X?
【发布时间】:2014-05-05 17:54:11
【问题描述】:

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

客户:

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

当我在本地主机上托管服务器时,一切正常。当我在具有本地网络的另一台机器上启动相同的程序时,在 192.168.x.x 并更改为:

客户:

Registry registry = LocateRegistry.getRegistry("192.168.x.x");
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.x.x,我该如何解决这个问题?我更喜欢只使用 java 代码,而不是使用配置文件修改我的机器。我用的是linux

【问题讨论】:

  • 您的/etc/hosts 文件有误。
  • 您是否尝试使用特定主机名更新您的hosts 文件,然后将该主机名添加到getRegistry 而不是IP 地址?
  • 是的,我试过了,但没有用。现在 127.0.1.1 是我的计算机用户名,我也将其更改为 192.168.x.x
  • RMI 的工作方式首先连接到注册表并询问您感兴趣的对象的地址,然后连接到注册表给您的地址以便与目标对象对话.您已成功连接到 192.168.x.x 上的 registry,但注册表已将 127.0.1.1 作为目标对象的地址。

标签: java linux rmi


【解决方案1】:

这通常是由错误配置引起的。检查您的/etc/hosts 文件以确保:

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

众所周知,某些 Linux 发行版有此功能。

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

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

这是item A.1 in the FMI FAQ,但请注意该项目的标题有误。在lookup() 期间不会发生这种情况,它会在您在生成的存根上调用远程方法时发生。

【讨论】:

  • 您能解释一下吗:您的真实主机名映射到您的真实主机地址。我在/etc/hosts 127.0.0.1 localhost 127.0.1.1 my-username 的ipv4 configuarain 下有两个实体 是这样吗? “众所周知,一些 Linux 发行版有这种从头到尾的特性。”这是我拥有的吗?我试图将 127.0.1.1 更改为我的 192.168.xx 地址,但它不起作用:/
  • 如果您的 IP 地址正确,它应该可以工作。
  • /etc/hosts 确实 将我的主机名映射到我的 IP 地址。由于这是一台笔记本电脑,它会定期切换 IP 地址,并且 /etc/hosts 应该是一个 static 配置文件。如果 RMI 依赖于此才能正常运行,我认为这是问题所在。
  • @AI0867 这取决于它没有FAQ项目中提到的错误。 localhost127.0.0.1 确实应该彼此静态映射,仅此而已,如果不是,就会出现问题。
  • 这个答案应该被接受。实际上,它不是配置错误。相反,一些 linux 发行版(我的是 Ubuntu Server 18.04)会将 127.0.1.1 分配为您在 /etc/hosts 中的主机名地址。
【解决方案2】:

我刚刚遇到了同样的问题。我正在做的事情与你正在做的事情非常相似。我注意到的是,我第一次运行客户端程序时,它失败了(根据防火墙测试的设计) - 它失败并显示一条错误消息,显示我最初指定的主机的实际 IP 地址(192.168.x.x address ),但所有后续失败都表明它无法连接到 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" ) ;

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

【讨论】:

  • 该属性不必设置,如果未设置,RMI 通过 InetAddress 类获取主机名,如我的回答中所述。它不会使用“”创建引用,并且 JVM 不会以所描述的方式“对此做出反应”,因为它永远不会发生。
  • 原谅我,我错误地陈述了这个事实 - 如果 JVM 无法使用 InetAddress 类的方法确定主机的 IP 地址,则根本不会创建 java.rmi.server.hostname 属性而不是被创建为“”。但是,我仍然很好奇 - 在这种情况下,服务器是在不引用 RMI 服务器的 IP 地址或主机名的情况下创建存根,还是创建存根并自动填充“localhost”或 127.0.0.1作为远程 rmi 服务器的位置?
  • 存根始终具有某种主机名或 IP 地址。它首先查看java.rmi.server.hostname,然后查看InetAddress 产生的任何内容。如果它产生 127.0.0.1 可能是因为我的回答中描述的配置错误。它不是由 Java 提供的。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2011-05-14
  • 1970-01-01
  • 2015-07-23
相关资源
最近更新 更多