java.rmi.ConnectException: Conexiune refuzată la gazda: 127.0.1.1.1; (Programare, Java, Excepție, Conexiune, Rmi, Remoteobject)

heythatsmekri a intrebat.
    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

Primesc această excepție atunci când încerc să conectez un client la distanță la serverul meu. Atât în server, cât și în client, hostName pentru registryUrl din rmi este adresa IP publică a serverului. Am încercat, de asemenea, să pun localhost în server, dar eroarea nu se schimbă.

Politica mea java.policy este setată pentru a permite toate conexiunile la toate porturile și nu am activat niciun firewall pe server sau pe client.

Aveți vreo sugestie ce ar putea fi?

14 răspunsuri
user207421

Aceasta este punctul A.1 din FAQ RMI. Trebuie fie să vă reparați fișierul /etc/hosts, fie să setați java.rmi.server.hostname pe server.

Comentarii

  • Vă rog, cum ați rezolvat această problemă? Am încercat cu: java HelloServer -Djava.rmi.server.hostname=192.168.1.5 dar clientul nu poate găsi serverul java.rmi.ConnectException: Conexiune refuzată la gazda: 127.0.1.1.1; excepția imbricata este: java.net.ConnectException: Connexion refusée –  > Por cercetător.
  • @cercetător Trebuie să o setezi la JVM-ul serverului. Nu la client. –  > Por user207421.
  • @cercetător Și, de asemenea, trebuie să furnizezi argumentele JVM înainte de numele clasei, nu după. –  > Por user207421.
  • „serverul” este partea de schelet pe care a fost creat inițial stub-ul prin .export; pe partea serverului modificați implicit stub-ul încorporat ip pe care clientul îl invocă: System.setProperty("java.rmi.server.hostname","1.2.3.4"); însemnând că acesta este ip-ul pe care destinația/skeletonul/serverul este abordabil –  > Por qrtLs.
  • @PatrickBucher Persoana pe care o menționați a contribuit doar cu o întrebare. Ar trebui să îi mulțumiți este eu. –  > Por user207421.
Raydelto Hernandez

PROBLEMĂ REZOLVATĂ

Am avut exact aceeași eroare. Atunci când obiectul la distanță a fost legat la rmiregistry, acesta a fost atașat cu adresa IP loopback, care va eșua în mod evident dacă încercați să invocați o metodă de la o adresă la distanță. Pentru a remedia această problemă, trebuie să setați java.rmi.server.hostname la adresa IP la care alte dispozitive pot ajunge la rmiregistry-ul dvs. prin rețea. Nu funcționează atunci când încercați să setați parametrul prin JVM. Pentru mine a funcționat doar adăugând următoarea linie la codul meu, chiar înainte de a lega obiectul de rmiregistry:

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

În acest caz, adresa IP din rețeaua locală a PC-ului care leagă obiectul de la distanță de registrul RMI este 192.168.1.2.

Comentarii

  • Este face funcționează atunci când „încercați să setați parametrul prin JVM”, ceea ce înseamnă, probabil, că vă referiți la linia de comandă. Dacă utilizați System.setProperty(), trebuie să îl setați înainte de a exporta obiectul la distanță, nu doar înainte de legare. –  > Por user207421.
Jianxing Fan

puteți utiliza LocalRegistry, cum ar fi:

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

Comentarii

  • El nu primește un eror pe rebind(). –  > Por user207421.
Paul

Am găsit multe dintre Q&A pe acest subiect, nu m-a ajutat nimic – asta pentru că problema mea era mai de bază ( ce pot să spun, nu sunt un guru al rețelelor 🙂 ). Adresa mea ip din /etc/hosts era incorectă. Ceea ce încercasem includea următoarele pentru 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

Problema mea era că îmi schimbasem adresa ip cu multe luni în urmă, dar nu mi-am actualizat niciodată fișierul /etc/hosts. se pare că, în mod implicit, jconsole folosește într-un fel sau altul adresa ip hostname -i ip, chiar dacă vizualizam procesele locale. Cea mai bună soluție a fost să schimb pur și simplu fișierul /etc/hosts.

Cealaltă soluție care poate funcționa este să obțineți adresa ip corectă din /sbin/ifconfig și să folosiți acea adresă ip atunci când specificați adresa ip în, de exemplu, un script catalina.sh:

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

CJeremy

Poate că registrul rmiregistry nu a fost creat înainte ca clientul să încerce să se conecteze la serverul dvs. și acest lucru ar duce la această excepție.În Linux, puteți utiliza „netstat” pentru a verifica dacă registrul rmiregistry este conectat pe portul corect pe care l-ați atribuit în codul java.

Comentarii

  • Aceasta nu ar cauza această excepție cu acest stacktrace. –  > Por user207421.
  • Oh, dar ar face-o, observând-o pe caseta mea Archlinux acum. Crearea registrului cu LocateRegistry.createRegistry(1099) în clasa mea de server, în loc să îl obțin cu LocateRegistry.getRegistry() rezolvă problema pentru mine. –  > Por alisianoi.
  • Rezolvă o altă problemă. Rezolvă problema ‘conexiune refuzată’ atunci când se face căutarea. Această problemă este „conexiune refuzată atunci când se apelează metoda la distanță. –  > Por user207421.
Ar maj

Dacă lucrați într-un mediu Linux, deschideți fișierul /etc/hosts.allowadăugați următoarea linie

ALL

Wildcards

De asemenea, verificați și linia /etc/hostname și /etc/host pentru a vedea dacă nu cumva este ceva în neregulă acolo.

A trebuit să schimb / etc / host de la

127.0.0.1 localhost
127.0.1.1 AMK

în

127.0.0.1 localhost
127.0.0.1 AMK

de asemenea, am scris în ALL în fișier /etc/hosts.allow care anterior era complet gol

Acum totul funcționează

nu știu cât de sigur este. trebuie să citiți mai multe despre opțiunile posibile pentru /etc/hosts.allow pentru a face ceva care necesită o notă de securitate.

Comentarii

  • Mulțumesc, tocmai am modificat /etc/hosts pentru a îndrepta localhost și hostname-ul meu către același ip, așa cum arătați, iar acum totul funcționează –  > Por Davide.
SVashisth

Dacă ați încercat să modificați etc/hosts și să adăugați și proprietatea java.rmi.server.hostname, dar în continuare registrul este legat la 127.0.0.1

problema pentru mine a fost rezolvată după ce am setat în mod explicit proprietatea System prin cod, deși aceeași proprietate nu a fost preluată din jvm args

Comentarii

  • Registrul nu este legat la 127.0.0.0.1 Dacă proprietatea System nu a funcționat din linia de comandă, nu ați făcut-o cum trebuie. –  > Por user207421.
Dinu94

Am avut exact aceeași problemă și problema mea era că aveam 2 adrese IP din 2 rețele diferite configurate în etc/hosts așa cum urmează.

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

Acest lucru ar fi trebuit să se întâmple pentru că exista un conflict cu privire la ce IP să fie folosit pentru ca celelalte dispozitive să ajungă la rmiregistry prin rețea.

După ce am eliminat înregistrarea suplimentară care nu este necesară, am reușit să rezolv problema.

Astfel, fișierul meu etc/hosts avea doar următoarea înregistrare.

10.xxx.x.xxx    localhost

Joshua

Funcționează pentru mine după ce am scăpat de „::1” în /etc/hosts.

Leonardo Rignanese

În cazul meu nu am putut să editez fișierul hosts deoarece folosesc un pc de la universitate.

Am rezolvat problema rulând rmiregistry în alt port (în loc de 1099) cu:

rmiregistry <port>

și apoi rulând serverul pe acel port.

Practic era o eroare cauzată de portul ocupat.

Comentarii

  • Dacă portul era deja ocupat nu primeai „connection refused”, iar schimbarea Regsitry în alt port nu rezolva nimic decât dacă ajustai și codul, iar portul 1099 era rezervat pentru RMI Registry din 1996, așa că orice presupus proces care se presupune că îl asculta deja era neconform în mod grav. –  > Por user207421.
Saman Salehi

atunci când doriți să vă conectați la un server la distanță cu RMI trebuie să adăugați o proprietate de sistem, la fel ca:

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

sau adăugați o variabilă de mediu.

În cazul meu, am obținut Conexiune refuzată și am rezolvat-o adăugând această linie de cod în partea serverului:

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

Mulțumesc celuilalt tip pentru că m-a îndrumat să o rezolv.

Comentarii

  • Nu există nicio „obligație” în acest sens. Este necesar doar în cazul în care DNS-ul este configurat greșit sau în unele situații de gazde cu mai multe reședințe. –  > Por utilizator207421.
Dula

Pe Windows asigurați-vă că firewall-ul Windows este configurat / dezactivat corect. Eu a trebuit să dezactivez firewall-ul Windows (pentru că nu m-am deranjat cu configurarea lui) pentru ca lucrurile să funcționeze chiar și atunci când testam cu localhost.

Dr. Ahmad Abusukhon

Când am primit aceeași eroare pe mașina mea („connection is refused”), motivul a fost că am definit următoarele pe partea de server:

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

Astfel, serverul leagă atât IP-ul = 127.0.0.1, cât și portul 8080.

Dar pe partea de client folosisem:

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

Astfel, am uitat să adaug numărul portului după localhost, așa că am rescris comanda de mai sus și am adăugat numărul portului 8080 după cum urmează:

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

și totul a funcționat bine.

Comentarii

  • Acest lucru nu este corect. URL-ul pe care îl utilizați pentru Registru nu determină la ce adresă IP este legat obiectul la distanță. Legătura IP a avut loc deja înainte de acest cod. –  > Por user207421.
Chimdesa Asebe

Pur și simplu puteți utiliza:

pe partea serverului:

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

pe partea de client:

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

Comentarii

  • Bine ați venit pe StackOverflow. Acest lucru nu răspunde la întrebarea inițială. –  > Por mjuarez.