2011-12-13 13 views
7

Estoy trabajando en un juego RMI de línea de comandos, pero, cada vez que intento mi servicio, recibo un error como este:Java RMI Conectar Excepción: La conexión se negó a acoger/tiempo de espera

java.rmi.ConnectException: Connection refused to host: 192.168.56.1; nested exception is: 
    java.net.ConnectException: Connection timed out: connect 

Este es la clase principal de mi Server:

public class RMIWar { 

    public static void main(String[] args) throws RemoteException, MalformedURLException { 
     try { 
      Controle obj = new Controle(4); 
      Registry reg = LocateRegistry.createRegistry(1099); 
      System.out.println("Server is ready"); 
      reg.rebind("CtrlServ", obj); 
     } 
     catch (Exception e) { 
      System.out.println("Error: " + e.toString()); 
     } 
    } 
} 

el principal de mi clase Client:

public class RMIWarClient { 
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException { 
     try { 
      Registry registry = LocateRegistry.getRegistry("localhost"); 
      ControleInt ctrl = (ControleInt) registry.lookup("CtrlServ"); 
      System.out.println("CtrlServ found...\n"); 
      BioRMI bio = new BioRMI(null, 5,5,5); 
      ctrl.thRegister("Test", bio.atk, bio.def, bio.agi); 

     } 

     catch (Exception e) { 
      System.out.println("Error: " + e); 
     } 
    } 
} 

¿Alguna sugerencia?

Respuesta

10

Pruebe si su puerto 1099 está disponible. Además, no mencionó qué sistema operativo está utilizando y si inició el registro antes de la ejecución de su servidor.

Este RMI tutorial explica:

Antes de arrancar el motor de cálculo, lo que necesita para iniciar el registro RMI . El registro de RMI es un recurso de arranque simple del lado del servidor que nombra recurso que permite a los clientes remotos obtener una referencia a un objeto remoto inicial .

De forma predeterminada, el registro se ejecuta en el puerto 1099, como el suyo. Como los informes de tutorial, simplemente abrir un símbolo del sistema (en Windows) o un terminal de comandos (en un tipo UNIX OS) y tipo:

Para Windows (uso javaw si inicio no está disponible):

start rmiregistry 

del sistema operativo Solaris o Linux:

rmiregistry & 

ACTUALIZACIÓN

Observé, siguiendo el tutorial de Oracle y un proyecto mío hace tiempo, que en la clase Server, no exportó el objeto al tiempo de ejecución de RMI. Entonces habrá que editar estas líneas:

Controle obj = new Controle(4); 
Registry reg = LocateRegistry.createRegistry(1099); 
System.out.println("Server is ready"); 
reg.rebind("CtrlServ", obj); 

a:

Controle obj = new Controle(4); 
Controle stub = (Controle) UnicastRemoteObject.exportObject(obj, 0); 
Registry reg = LocateRegistry.createRegistry(1099); 
System.out.println("Server is ready"); 
reg.rebind("CtrlServ", stub); 

porque los informes tutoriales:

El método UnicastRemoteObject.exportObject estática exporta el objeto remoto suministrado de forma que puede recibir invocaciones de sus métodos remotos de clientes remotos.

Además, si usted está utilizando la misma máquina para una invocación RMI, no es necesaria en la clase Client:

Registry registry = LocateRegistry.getRegistry("localhost"); 

Simplemente invocan:

Registry registry = LocateRegistry.getRegistry(); 

porque los informes de Oracle :

La sobrecarga sin argumento de LocateRegistry.getReg terio sintetiza una referencia a un registro en el host local y en el puerto de matrícula por defecto, 1099. Debe utilizar una sobrecarga que tiene un parámetro int si se crea el registro en un puerto distinto de 1099.

+0

Nada de esto daría cuenta de un tiempo de espera de conexión. – EJP

+2

un puerto firewall sería –

+0

@EJP Sobre el tiempo de espera de conexión, escribí: "Prueba si su puerto 1099 está disponible". Esto significaría verificar si el puerto está disponible o cortafuegos. Mi nota sobre el inicio de la investigación es porque el OP no escribió nada al respecto y porque, a veces, la falta de ejecución del servicio es la razón de que se rechace una conexión. Si el Cliente desea ejecutar un método de Servidor, pero si el Servidor no se ejecutó localmente con el servicio, el Cliente nunca ejecutará el método. –

0

Tenga cuidado con los puertos porque podrían bloquearse para un firewall, por ejemplo, si está trabajando en un área segura como usted o la universidad, el administrador podría haber implementado algunas protecciones ...

0

No lo hago vea cómo puede obtener esa excepción de ese código. De acuerdo con el código, su servidor y su cliente se ejecutan en el mismo host, y no obtiene tiempos de espera de conexión dentro del mismo host.

Suponiendo que ese no es su código real y está buscando el registro correcto (argumento de host en getRegistry()), le preguntaría si 192.168.56.1 es la dirección IP que espera ver dada su topología de red. Es una dirección LAN interna y si su cliente está fuera de la LAN, debería intentar conectarse a una dirección IP más pública. Si la dirección no es la que espera, lo remito a item A.1 on the RMI FAQ.

Cuestiones relacionadas