java.rmi.ConnectException:连接拒绝主机:127.0.1.1;

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 

当我尝试将远程客户端连接到我的服务器时出现此exception。 在服务器和客户端,rmi的registryUrl的hostName是服务器的公共IP地址。 我也试图把本地服务器,但错误不会改变。

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

任何build议可能是什么?

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

我发现很多关于这个话题的问答,并不是没有什么帮助我 – 那是因为我的问题是更基本的(我可以说我不是一个networking大师:))。 / 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=ABCD" #howeverI put the wrong ip here! export CATALINA_OPTS 

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

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

 -Djava.rmi.server.hostname=ABCD 

问题解决了

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

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

在这种情况下,绑定RMIregistry上的远程对象的PC的本地networking上的IP地址是192.168.1.2。

也许你的rmiregistry不会在客户端尝试连接到你的服务器之前创build的,并且会导致这个exception。在Linux中,你可以使用“netstat”来检查你的rmiregistry是否绑定在你分配给java代码的正确的端口上。

如果您已经尝试修改etc / hosts并添加java.rmi.server.hostname属性,但仍然将registry绑定到127.0.0.1

通过代码明确设置系统属性后,解决了我的问题,虽然没有从jvm args中挑选相同的属性

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

 ALL 

通配符

还要检查/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中删除“:: 1”后,它适用于我。

当你想用RMI连接到远程服务器时,你必须添加一个系统属性如下:

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

或添加环境variables。

对我来说,我得到了连接拒绝 ,并通过在服务器端添加这一行代码来解决它:

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

感谢其他人指导我解决这个问题。