Ответ 1
Это элемент A.1 в FAQ RMI. Вам нужно либо исправить файл /etc/hosts, либо установить свойство java.rmi.server.hostname
на сервере.
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
Я получаю это исключение, когда пытаюсь подключить удаленный клиент к моему серверу. В обоих серверах и клиенте hostName для registryUrl rmi является общедоступным IP-адресом сервера. Я также попытался поставить localhost на сервер, но ошибка не изменилась.
My java.policy настроен на предоставление всех подключений ко всем портам, и у меня нет брандмауэров, включенных на сервере или клиенте.
Любые предложения, которые могут быть?
Это элемент A.1 в FAQ RMI. Вам нужно либо исправить файл /etc/hosts, либо установить свойство java.rmi.server.hostname
на сервере.
РЕШЕНАЯ ПРОБЛЕМА
У меня была точно такая же ошибка. Когда удаленный объект получил привязку к rmiregistry, он был связан с IP-адресом loopback, который, очевидно, завершится неудачей, если вы попытаетесь вызвать метод с удаленного адреса. Чтобы исправить это, нам нужно установить свойство java.rmi.server.hostname на IP-адрес, где другие устройства могут подключиться к вашей сети через сеть. Он не работает, когда вы пытаетесь установить параметр через JVM. Он работал у меня, просто добавив следующую строку в мой код перед привязкой объекта к rmiregistry:
System.setProperty("java.rmi.server.hostname","192.168.1.2");
В этом случае IP-адрес локальной сети ПК, связывающий удаленный объект в реестре RMI, - 192.168.1.2.
Вы можете использовать LocalRegistry, такие как:
Registry rgsty = LocateRegistry.createRegistry(1888); rgsty.rebind("hello", hello);
Я нашел много Q & A по этой теме, ничто не помогло мне - это потому, что моя проблема была более базовой (что я могу сказать, что я не сетевой гуру:)). Мой IP-адрес в /etc/hosts был неправильным. Я попытался включить 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.
Другим решением, которое может работать, является получение вашего правильного IP-адреса из /sbin/ifconfig и использование этого IP-адреса при указании IP-адреса, например, в файле catalina.sh script:
-Djava.rmi.server.hostname=A.B.C.D
Возможно, ваш rmiregistry не будет создан до того, как клиент попытается подключиться к вашему серверу, и это приведет к этому исключению. В Linux вы можете использовать "netstat", чтобы проверить, что ваш rmiregistry должен быть связан на правом порту, который вы назначили в Java-коде.
Если вы пробовали модифицировать etc/hosts и добавили свойство java.rmi.server.hostname, но все же реестр привязан к 127.0.0.1
проблема для меня была решена после явного задания свойства System через код, хотя одно и то же свойство не было выбрано из 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
, чтобы сделать что-то, что требует безопасности.
У меня была точно такая же проблема, и моя проблема была в том, что у меня было 2 IP-адреса из 2 разных сетей, настроенных в etc/hosts, как показано ниже.
10.xxx.x.xxx localhost
192.xxx.x.xxx localhost
Это должно быть связано с тем, что возник конфликт из-за того, какой IP-адрес будет использоваться для других устройств для доступа к сетевому протоколу.
После того, как я удалил лишнюю запись, которая не требуется, я смог решить проблему.
Так что мой файл etc/hosts содержал только следующую запись.
10.xxx.x.xxx localhost
Он работает для меня после избавления от ":: 1" в/etc/hosts.
В моем случае я не смог отредактировать файл hosts из-за использования компьютера из университета.
Я исправил проблему с запуском rmiregistry в другом порту (вместо 1099) с помощью:
rmiregistry <port>
и затем запустить сервер на этом порту.
Это была в основном ошибка, вызванная занятым портом.
когда вы хотите подключиться к удаленному серверу с помощью 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
Спасибо другому парню за руководство меня, чтобы решить его.
В Windows убедитесь, что ваш брандмауэр Windows правильно настроен/отключен. Мне пришлось отключить брандмауэр Windows (потому что я не удосужился его настроить), чтобы заставить работать все, даже когда я тестировал с localhost.