【问题标题】:java.rmi.ConnectException: Connection refused to host: 127.0.1.1;java.rmi.ConnectException:连接拒绝主机:127.0.1.1;
【发布时间】:2017-05-04 22:03:54
【问题描述】:
    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:128)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy0.notifyMe(Unknown Source)
    at CallbackServerImpl.doCallback(CallbackServerImpl.java:149)
    at CallbackServerImpl.registerForCallback(CallbackServerImpl.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at sun.rmi.transport.Transport$1.run(Transport.java:174)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
    Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 23 more

当我尝试将远程客户端连接到我的服务器时出现此异常。在 server 和 client 中,rmi 的 registryUrl 的 hostName 是服务器的公共 IP 地址。我也尝试将 localhost 放在服务器中,但错误没有改变。

我的 java.policy 设置为授予所有端口的所有连接,并且我没有在服务器或客户端中启用防火墙。

有什么建议吗?

【问题讨论】:

    标签: java exception connection rmi remoteobject


    【解决方案1】:

    你可以使用LocateRegistry 如:

    Registry rgsty = LocateRegistry.createRegistry(1888);
    rgsty.rebind("hello", hello);
    

    【讨论】:

    • 他在rebind() 上没有出错。
    【解决方案2】:

    你可以使用:

    在服务器端:

    Registry <objectName1> =LocateRegisty.createRegistry(1099);
    Registry <objectName2> =LocateRegisty.getRegistry();
    

    在客户端:

    Registry <object name you want> =LocateRegisty.getRegistry();
    

    【讨论】:

    • 欢迎来到 StackOverflow。这没有回答最初的问题。
    【解决方案3】:

    当我在我的机器上遇到同样的错误(“连接被拒绝”)时,原因是我在服务器端定义了以下内容:

     Naming.rebind("rmi://localhost:8080/AddService"
       ,addService); 
    

    因此服务器绑定了 IP = 127.0.0.1 和端口 8080。

    但在客户端我使用过:

    AddServerInterface st = (AddServerInterface)Naming.lookup("rmi://localhost"
                            +"/AddService");
    

    所以忘记在localhost后面加上端口号,所以我重写了上面的命令,加上端口号8080如下:

    AddServerInterface st = (AddServerInterface)Naming.lookup("rmi://localhost:8080"
                            +"/AddService");
    

    一切正常。

    【讨论】:

    • 这是不正确的。您用于注册表的 URL 不能确定远程对象绑定到的 IP 地址。 IP 绑定在此代码之前已经发生。
    【解决方案4】:

    在我的情况下,我无法编辑主机文件,因为使用的是大学里的电脑。

    我修复了在另一个端口(而不是 1099)中运行 rmiregistry 的问题:

    rmiregistry <port>
    

    然后在该端口上运行服务器。

    基本上是端口占用导致的错误。

    【讨论】:

    • 如果端口已经被占用,你不会得到“连接被拒绝”,除非你也调整了代码,否则将 Regsitry 更改为另一个端口并不能解决任何问题,并且端口 1099 被保留用于到 1996 年,RMI 注册中心,因此据称已经在监听的任何所谓的进程都存在一些不合规性。
    【解决方案5】:

    在 Windows 上,确保您的 Windows 防火墙已正确配置/禁用。即使在使用 localhost 进行测试时,我也必须禁用 Windows 防火墙(因为我没有费心对其进行配置)才能正常工作。

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题,我的问题是我在 etc/hosts 中配置了来自 2 个不同网络的 2 个 IP 地址,如下所示。

      10.xxx.x.xxx    localhost
      192.xxx.x.xxx   localhost
      

      这应该是因为在其他设备使用哪个 IP 以通过网络访问 rmiregistry 方面存在冲突。

      一旦我删除了不需要的额外记录,我就能解决问题。

      所以我的 etc/hosts 文件只有以下记录。

      10.xxx.x.xxx    localhost
      

      【讨论】:

        【解决方案7】:

        当您想使用 RMI 连接到远程服务器时,您必须添加与以下相同的系统属性:

        System.setProperty("java.rmi.server.hostname","Ip or DNS of the server");
        

        或添加环境变量。

        对我来说,我得到了 Connection Refused 并通过在服务器端添加这行代码来解决它:

         java -jar -Djava.rmi.server.hostname="ip or dns of the server" packageName.jar
        

        感谢其他人指导我解决它。

        【讨论】:

        • 没有“必须”。仅在 DNS 配置错误或某些多宿主主机情况下才需要。
        【解决方案8】:

        删除 /etc/hosts 中的 "::1" 后它对我有用。

        【讨论】:

          【解决方案9】:

          如果您在 Linux 环境中运行,请打开文件 /etc/hosts.allow 添加以下行

          ALL
          

          Wildcards

          还要检查/etc/hostname/etc/host,看看那里是否有问题。

          我不得不将我的 / etc / host 更改为

          127.0.0.1 localhost
          127.0.1.1 AMK
          

          127.0.0.1 localhost
          127.0.0.1 AMK
          

          还写在ALL的文件/etc/hosts.allow之前完全是空的

          现在一切正常

          不知道它有多安全。您必须阅读更多关于 /etc/hosts.allow 的可能选项来执行需要一点安全性的操作。

          【讨论】:

          • 谢谢,我只是修改 /etc/hosts 以将我的 localhost 和主机名指向同一个 ip,如您所示,现在一切正常
          【解决方案10】:

          问题已解决

          我遇到了完全相同的错误。当远程对象绑定到 rmiregistry 时,它附加了环回 IP 地址,如果您尝试从远程地址调用方法,这显然会失败。为了解决这个问题,我们需要将 java.rmi.server.hostname 属性设置为其他设备可以通过网络访问您的 rmiregistry 的 IP 地址。当您尝试通过 JVM 设置参数时,它不起作用。 它对我有用,只需在将对象绑定到 rmiregistry 之前将以下行添加到我的代码中:

          System.setProperty("java.rmi.server.hostname","192.168.1.2");

          在这种情况下,在 RMI Registry 上绑定远程对象的 PC 本地网络上的 IP 地址是 192.168.1.2。

          【讨论】:

          • 当您“尝试通过 JVM 设置参数”时,它确实起作用,这可能是指在命令行上。如果你使用System.setProperty(),你必须在导出远程对象之前设置它,而不是在绑定之前。
          【解决方案11】:

          如果您尝试修改 etc/hosts 并添加 java.rmi.server.hostname 属性,但注册表仍绑定到 127.0.0.1

          虽然没有从 jvm args 中选择相同的属性,但在通过代码显式设置系统属性后解决了我的问题

          【讨论】:

          • 注册表未绑定到 127.0.0.1 如果系统属性在命令行中不起作用,则说明您做错了。
          【解决方案12】:

          我发现了很多关于这个主题的问答,但没有什么对我有帮助 - 那是因为我的问题更基本(我能说我不是网络专家:))。我在 /etc/hosts 中的 IP 地址不正确。我尝试过的 CATALINA_OPTS 包括以下内容:

          CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true -Xmx128M -server 
          -Dcom.sun.management.jmxremote 
          -Dcom.sun.management.jmxremote.port=7091 
          -Dcom.sun.management.jmxremote.authenticate=false 
          -Dcom.sun.management.jmxremote.ssl=false
          -Djava.rmi.server.hostname=A.B.C.D"  #howeverI put the wrong ip here!
          
          export CATALINA_OPTS
          

          我的问题是我几个月前更改了我的 IP 地址,但从未更新我的 /etc/hosts 文件。似乎默认情况下 jconsole 以某种方式使用主机名 -i ip 地址,即使我正在查看本地进程。最好的解决方案是简单地更改 /etc/hosts 文件。

          另一个可行的解决方案是从 /sbin/ifconfig 获取正确的 IP 地址,并在指定 IP 地址时使用该 IP 地址,例如 catalina.sh 脚本:

          -Djava.rmi.server.hostname=A.B.C.D
          

          【讨论】:

            【解决方案13】:

            也许在客户端尝试连接到您的服务器之前没有创建您的 rmiregistry,这会导致此异常。在 Linux 中,您可以使用“netstat”检查您的 rmiregistry 是否绑定在您在 java 代码中分配的正确端口上。

            【讨论】:

            • 此堆栈跟踪不会导致此异常。
            • 哦,但它会,现在在我的 Archlinux 机器上观察它。在我的服务器类中使用LocateRegistry.createRegistry(1099) 创建注册表而不是使用LocateRegistry.getRegistry() 获取它可以解决我的问题。
            • 它解决了另一个问题。它解决了在进行查找时的“连接被拒绝”。这个问题是“连接被拒绝”调用远程方法时
            【解决方案14】:

            这是item A.1 in the RMI FAQ。您需要修复 /etc/hosts 文件或在服务器上设置 java.rmi.server.hostname 属性。

            【讨论】:

            • 请问,你是怎么解决这个问题的?我尝试使用:java HelloServer -Djava.rmi.server.hostname=192.168.1.5 但客户端找不到服务器 java.rmi.ConnectException:连接拒绝主机:127.0.1.1;嵌套异常是:java.net.ConnectException: Connexion refusée
            • @researcher 您必须在服务器 JVM 上设置它。不是客户。
            • @researcher 你还必须在类名之前提供 JVM 参数,而不是之后。
            • “服务器”是最初通过 .export 创建存根的骨架端;在服务器端修改客户端调用的隐式存根嵌入 ip:System.setProperty("java.rmi.server.hostname","1.2.3.4"); 表示这是目标/骨架/服务器可访问的 ip
            • @PatrickBucher 你提到的那个人只贡献了一个问题。你应该感谢的是我。
            猜你喜欢
            • 2013-07-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-10
            • 2021-12-15
            • 2015-06-23
            相关资源
            最近更新 更多