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

È stato utile?

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) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top