2009-12-01 12 views
11

tengo un problema utilizando RMI de Java:de conexiones para RMI negado con localhost

Cuando estoy tratando de ejecutar mi servidor, aparece un ConnectException (ver más abajo).

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

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

cuando se utiliza RMI: // localhost: 2020/RemoteDataPointHandler lugar, no funciona bien. Además, usar el puerto predeterminado no funciona. También intenté usar la dirección ip 127.0.0.1, pero con el mismo efecto.

mis argumentos en 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 

+1

Yo diría que tienes un problema de tiempo aquí. El Registro no ha comenzado completamente cuando haces la nueva vinculación. – EJP

Respuesta

5

parece que funciona cuando se sustituye la

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

por

LocateRegistry.createRegistry(2020); 

alguien una idea por qué? ¿Cual es la diferencia?

+4

El segundo lo inicia como un objeto remoto en la JVM actual. Primero comienza un proceso separado. – EJP

5

Necesita tener un rmiregistry ejecutándose antes de intentar conectar (registrar) un servicio de 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 de LocateRegistry

+0

Lo hace, ver su código. – EJP

11

tenía un problema con el que simliar 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 está exportado (como en mi caso).

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

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

corre el rmiregistry.exe en javas-bin directorio en un nuevo proceso y continúa paralelo con el código Java.

LocateRegistry.createRegistry(2020); 

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

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

+0

¡Gracias por la explicación! – Fortega

1

Una diferencia que podemos observar en Windows es:

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

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

mientras que si se utiliza Registry registry = LocateRegistry.createRegistry(1024);

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

Creo que Java maneja de una manera diferente.

y este es mi archivo server.policy

Antes de ejecutar la aplicación, asegúrese de que usted mató a todos sus javaw.exe existente y rmiregistry.exe corresponde a su programas de RMI que se ya se está ejecutando.

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

argumento
Runtime.getRuntime.exec(""); 


// Standard extensions get all permissions by default 

grant { 
    permission java.security.AllPermission; 
}; 

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

parece que usted debe configurar su sistema como String[] , por ejemplo:

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

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

Cuestiones relacionadas