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

Я получаю это исключение, когда пытаюсь подключить удаленного клиента к моему серверу. И на сервере, и на клиенте hostName для registryUrl rmi является общедоступным IP-адресом сервера. Я также попытался поставить localhost на сервер, но ошибка не изменилась.

Мой java.policy настроен на предоставление всех подключений ко всем портам, и у меня не включены брандмауэры на сервере или клиенте.

Любые предложения, какие могут быть?


person heythatsmekri    schedule 28.03.2013    source источник


Ответы (14)


Это пункт A.1 в часто задаваемых вопросах RMI < / а>. Вам нужно либо исправить ваш файл / etc / hosts, либо установить свойство java.rmi.server.hostname на сервере.

person user207421    schedule 29.03.2013
comment
Пожалуйста, как вы решили эту проблему? Я пытаюсь использовать: java HelloServer -Djava.rmi.server.hostname = 192.168.1.5, но клиент не может найти сервер java.rmi.ConnectException: соединение с хостом отказано: 127.0.1.1; вложенное исключение: java.net.ConnectException: Connexion refusée - person researcher; 10.12.2014
comment
@researcher Вы должны установить его на сервере JVM. Не клиент. - person user207421; 26.06.2015
comment
@researcher И вы также должны указать аргументы JVM перед именем класса, а не после него. - person user207421; 01.02.2018
comment
«сервер» - это сторона скелета, на которой заглушка была изначально создана через .export; на стороне сервера измените неявно встроенный тупиковый IP-адрес, который вызывает клиент: System.setProperty("java.rmi.server.hostname","1.2.3.4"); означает, что это IP-адрес, к которому доступен пункт назначения / скелет / сервер - person qrtLs; 01.05.2018
comment
@researcher После бесконечных часов попыток определения имени хоста сервера наконец-то это удалось! Я так благодарен! БЛАГОДАРИТЬ. ТЫ. - person Patrick Bucher; 11.05.2018
comment
@PatrickBucher Человек, которого вы упомянули, только задал вопрос. Вы должны благодарить меня. - person user207421; 10.05.2020

ПРОБЛЕМА РЕШЕНА

У меня была точно такая же ошибка. Когда удаленный объект был привязан к rmiregistry, он был привязан с IP-адресом обратной петли, который, очевидно, не сработает, если вы попытаетесь вызвать метод с удаленного адреса. Чтобы исправить это, нам нужно установить для свойства java.rmi.server.hostname IP-адрес, по которому другие устройства могут получить доступ к вашему rmiregistry по сети. Это не работает, когда вы пытаетесь установить параметр через JVM. Это сработало для меня, просто добавив следующую строку в мой код непосредственно перед привязкой объекта к rmiregistry:

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

В этом случае IP-адрес в локальной сети ПК, связывающий удаленный объект в реестре RMI, - 192.168.1.2.

person Raydelto Hernandez    schedule 02.03.2015
comment
Это действительно работает, когда вы «пытаетесь установить параметр через JVM», что вы, вероятно, имеете в виду в командной строке. Если вы используете System.setProperty(), вы должны установить его перед экспортом удаленного объекта, а не только перед привязкой. - person user207421; 26.06.2015

вы можете использовать LocalRegistry, например:

Registry rgsty = LocateRegistry.createRegistry(1888);
rgsty.rebind("hello", hello);
person Jianxing Fan    schedule 28.09.2018
comment
Он не понимает rebind(). - person user207421; 28.12.2020

Я нашел много вопросов и ответов по этой теме, ничто не помогало мне - это потому, что моя проблема была более простой (что я могу сказать, что я не гуру сетей :)). Мой 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:

-Djava.rmi.server.hostname=A.B.C.D
person Paul    schedule 06.03.2014

Возможно, ваша rmiregistry не будет создана до того, как клиент попытается подключиться к вашему серверу, и это приведет к этому исключению. В Linux вы можете использовать "netstat", чтобы проверить, что ваш rmiregistry привязан к правильному порту, который вы назначили в java-коде.

person CJeremy    schedule 09.08.2013
comment
Это не приведет к возникновению этого исключения с этой трассировкой стека. - person user207421; 17.08.2014
comment
О, но это было бы, наблюдая это сейчас на моем ящике Archlinux. Создание реестра с LocateRegistry.createRegistry(1099) в моем классе сервера вместо того, чтобы получать его с LocateRegistry.getRegistry(), решает проблему для меня. - person alisianoi; 23.01.2017
comment
Это решает еще одну проблему. Он решает проблему отказа в соединении при поиске. Это проблема «в соединении отказано» при вызове удаленного метода. - person user207421; 24.09.2017

Если вы работаете в среде Linux, откройте файл /etc/hosts.allow и добавьте следующую строку

ALL

Подстановочные знаки

Также проверьте /etc/hostname и /etc/host, чтобы убедиться, что там что-то не так.

Мне пришлось поменять свой / etc / host с

127.0.0.1 localhost
127.0.1.1 AMK

to

127.0.0.1 localhost
127.0.0.1 AMK

также написал в ALL в файле /etc/hosts.allow, который ранее был полностью пустым

Теперь все работает

не знаю, насколько это безопасно. вы должны узнать больше о возможных вариантах /etc/hosts.allow, чтобы делать что-то, что требует некоторой защиты.

person Ar maj    schedule 06.09.2016
comment
Спасибо, я просто изменяю / etc / hosts, чтобы указать мой локальный хост и имя хоста на тот же IP-адрес, который вы показываете, и теперь все работает - person Davide; 30.10.2019

Если вы пробовали изменить etc / hosts и добавить свойство java.rmi.server.hostname, но реестр все еще привязан к 127.0.0.1

проблема для меня была решена после явной установки свойства System через код, хотя это свойство не было выбрано из jvm args

person SVashisth    schedule 04.06.2013
comment
Реестр не привязан к 127.0.0.1. Если системное свойство не работает из командной строки, вы сделали это неправильно. - person user207421; 17.08.2014

У меня это работает после того, как я избавился от ":: 1" в / etc / hosts.

person Joshua    schedule 13.10.2016

У меня была такая же проблема, и моя проблема заключалась в том, что у меня было 2 IP-адреса из 2 разных сетей, настроенных в etc / hosts, как показано ниже.

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

Это должно быть связано с конфликтом в отношении того, какой IP-адрес должен использоваться другими устройствами для доступа к rmiregistry по сети.

Как только я удалил лишнюю запись, которая не требуется, я смог решить проблему.

Итак, в моем файле etc / hosts была только следующая запись.

10.xxx.x.xxx    localhost
person Dinu94    schedule 10.01.2019

В моем случае мне не удалось отредактировать файл hosts, потому что я использовал компьютер из университета.

Я исправил проблему с запуском rmiregistry в другом порту (вместо 1099) с помощью:

rmiregistry <port>

а затем запустить сервер на этом порту.

По сути, это была ошибка, вызванная занятым портом.

person Leonardo Rignanese    schedule 06.09.2019
comment
Если порт уже был занят, вы не получили сообщение «В соединении отказано», и изменение Regsitry на другой порт ничего не исправило, если вы также не изменили код, а порт 1099 был зарезервирован для реестра RMI к 1996 году, так что все, что предполагалось процесс якобы уже слушал, что в некоторых случаях не соответствовало требованиям. - person user207421; 04.10.2019

если вы хотите подключиться к удаленному серверу с помощью RMI, вы должны добавить системное свойство, такое же, как:

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

или добавить переменную окружения.

Для меня я получил Отказ в соединении и решил его, добавив эту строку кода на стороне сервера:

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

Спасибо другому парню за то, что помог мне решить эту проблему.

person Saman Salehi    schedule 13.09.2017
comment
В этом нет никакого «обязательного». Это необходимо только при неправильной настройке DNS или в некоторых ситуациях с несколькими узлами сети. - person user207421; 24.09.2017

В Windows убедитесь, что ваш брандмауэр Windows правильно настроен / отключен. Мне пришлось отключить брандмауэр Windows (потому что я не стал его настраивать), чтобы все работало, даже когда я тестировал с помощью localhost.

person Dula    schedule 22.01.2019

Когда я получил ту же ошибку на моем компьютере («соединение отклонено»), причина заключалась в том, что я определил следующее на стороне сервера:

 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");

и все работало нормально.

person Dr. Ahmad Abusukhon    schedule 16.12.2019
comment
Это не так. URL-адрес, который вы используете для реестра, не определяет, к какому IP-адресу привязан удаленный объект. Привязка IP уже произошла до этого кода. - person user207421; 28.12.2020

Просто вы можете использовать:

на стороне сервера:

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

на стороне клиента:

Registry <object name you want> =LocateRegisty.getRegistry();
person Chimdesa Asebe    schedule 14.01.2020
comment
Добро пожаловать в StackOverflow. Это не отвечает на исходный вопрос. - person mjuarez; 14.01.2020