Pregunta

Tengo un problema al usar java rmi:

Cuando intento ejecutar mi servidor, obtengo una excepción de conexión (ver más abajo).

La excepción ocurre cuando se ejecuta el método de reenlace:

Runtime.getRuntime().exec("rmiregistry 2020");
MyServer server = new MyServer();
Naming.rebind("//localhost:2020/RemoteDataPointHandler", server);

cuando se usa rmi: // localhost: 2020 / RemoteDataPointHandler, tampoco funciona. También el uso del puerto predeterminado no funciona. También intenté usar la dirección IP 127.0.0.1, pero con el mismo efecto.

mis argumentos de tiempo de ejecución:

-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

¿Fue útil?

Solución 2

Parece funcionar cuando reemplazo el

Runtime.getRuntime().exec("rmiregistry 2020");

por

LocateRegistry.createRegistry(2020);

alguien una idea de por qué? ¿Cuál es la diferencia?

Otros consejos

tuvo un problema similar con esa excepción de conexión. se lanza cuando el registro aún no se ha iniciado (como en su caso) o cuando el registro ya no se ha exportado (como en mi caso).

pero un breve comentario sobre la diferencia entre las 2 formas de iniciar el registro:

Runtime.getRuntime().exec("rmiregistry 2020");

ejecuta el rmiregistry.exe en el directorio bin de Java en un nuevo proceso y continúa en paralelo con su código Java.

LocateRegistry.createRegistry(2020);

la llamada al método rmi inicia el registro, devuelve la referencia a ese objeto remoto del registro y luego continúa con la siguiente instrucción.

en su caso, el registro no se inicia a tiempo cuando intenta vincular su objeto

Debe tener un rmiregistry en ejecución antes de intentar conectar (registrar) un servicio RMI con él.

La llamada al método LocateRegistry.createRegistry (2020) crea y exporta un registro en el número de puerto especificado.

Consulte la documentación para LocateRegistry

Una diferencia que podemos notar en Windows es:

Si usa Runtime.getRuntime (). exec (" rmiregistry 1024 ");

puede ver que el proceso rmiregistry.exe se ejecutará en su Administrador de tareas

mientras que si usa Registry Registry = LocateRegistry.createRegistry (1024);

no puede ver el proceso ejecutándose en el Administrador de tareas,

Creo que Java lo maneja de una manera diferente.

y este es mi archivo server.policy

Antes de ejecutar la aplicación, asegúrese de haber eliminado todas las aplicaciones existentes. javaw.exe y rmiregistry.exe corresponde a sus programas rmi que son ya se está ejecutando.

El siguiente código funciona para mí usando Registry.LocateRegistry () o

Runtime.getRuntime.exec("");


// Standard extensions get all permissions by default

grant {
    permission java.security.AllPermission;
};

Argumento VM

-Djava.rmi.server.codebase=file:\C:\Users\Durai\workspace\RMI2\src\

Código:

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();
    }
  }
}

parece que debería establecer su comando como String [] , por ejemplo:

String[] command = new String[]{"rmiregistry","2020"};
Runtime.getRuntime().exec(command);

es igual que el estilo de main (String [] args) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top