Connessione Rmi rifiutata con localhost
-
22-07-2019 - |
Domanda
Ho un problema con java rmi:
Quando sto cercando di eseguire il mio server, ottengo un connectException (vedi sotto).
L'eccezione si verifica quando si esegue il metodo rebind:
Runtime.getRuntime().exec("rmiregistry 2020");
MyServer server = new MyServer();
Naming.rebind("//localhost:2020/RemoteDataPointHandler", server);
quando si utilizza invece rmi: // localhost: 2020 / RemoteDataPointHandler, non funziona neanche. Anche l'utilizzo della porta predefinita non funziona. Ho anche provato a utilizzare l'indirizzo IP 127.0.0.1, ma con lo stesso effetto.
my runtime args:
-Djava.security.policy=java.security.AllPermission
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: java.net.ConnectException: Connection refused at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171) at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:306) at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) at java.rmi.Naming.rebind(Naming.java:160) at be.fortega.knx.server.Main.(Main.java:25) at be.fortega.knx.server.Main.main(Main.java:16) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:433) at java.net.Socket.connect(Socket.java:524) at java.net.Socket.connect(Socket.java:474) at java.net.Socket.(Socket.java:371) at java.net.Socket.(Socket.java:184) at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569) ... 7 more
Soluzione 2
Sembra funzionare quando sostituisco
Runtime.getRuntime().exec("rmiregistry 2020");
da
LocateRegistry.createRegistry(2020);
qualcuno ha idea del perché? Qual è la differenza?
Altri suggerimenti
ha riscontrato un problema simliar con tale eccezione di connessione. viene generato quando il registro non è ancora stato avviato (come nel tuo caso) o quando il registro non è già esportato (come nel mio caso).
ma un breve commento alla differenza tra i 2 modi per avviare il registro:
Runtime.getRuntime().exec("rmiregistry 2020");
esegue rmiregistry.exe nella directory bin javas in un nuovo processo e continua parallelamente al codice java.
LocateRegistry.createRegistry(2020);
la chiamata al metodo rmi avvia il registro, restituisce il riferimento all'oggetto remoto del registro e continua con l'istruzione successiva.
nel tuo caso il registro non viene avviato in tempo quando si tenta di associare l'oggetto
È necessario disporre di un rmiregistry
prima di tentare di connettere (registrare) un servizio RMI con esso.
La chiamata del metodo LocateRegistry.createRegistry (2020)
crea ed esporta un registro sul numero di porta specificato.
Consulta la documentazione per LocateRegistry
Una differenza che possiamo notare in Windows è:
Se utilizzi Runtime.getRuntime (). exec (" rmiregistry 1024 ");
puoi vedere il processo rmiregistry.exe eseguito nel tuo Task Manager
considerando che se si utilizza Registry register = LocateRegistry.createRegistry (1024);
non puoi vedere il processo in esecuzione in Task Manager,
Penso che Java lo gestisca in modo diverso.
e questo è il mio file server.policy
Prima di eseguire l'applicazione, assicurati di aver ucciso tutto il tuo esistente javaw.exe e rmiregistry.exe corrispondono ai tuoi programmi rmi che sono già in esecuzione.
Il seguente codice funziona per me utilizzando Registry.LocateRegistry ()
o
Runtime.getRuntime.exec("");
// Standard extensions get all permissions by default
grant {
permission java.security.AllPermission;
};
Argomento VM
-Djava.rmi.server.codebase=file:\C:\Users\Durai\workspace\RMI2\src\
Codice:
package server;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class HelloServer
{
public static void main (String[] argv)
{
try {
if(System.getSecurityManager()==null){
System.setProperty("java.security.policy","C:\\Users\\Durai\\workspace\\RMI\\src\\server\\server.policy");
System.setSecurityManager(new RMISecurityManager());
}
Runtime.getRuntime().exec("rmiregistry 1024");
// Registry registry = LocateRegistry.createRegistry(1024);
// registry.rebind ("Hello", new Hello ("Hello,From Roseindia.net pvt ltd!"));
//Process process = Runtime.getRuntime().exec("C:\\Users\\Durai\\workspace\\RMI\\src\\server\\rmi_registry_start.bat");
Naming.rebind ("//localhost:1024/Hello",new Hello ("Hello,From Roseindia.net pvt ltd!"));
System.out.println ("Server is connected and ready for operation.");
}
catch (Exception e) {
System.out.println ("Server not connected: " + e);
e.printStackTrace();
}
}
}
sembra che dovresti impostare il tuo comando come String []
, ad esempio:
String[] command = new String[]{"rmiregistry","2020"};
Runtime.getRuntime().exec(command);
è proprio come lo stile di main (String [] args)
.