2011-12-13 8 views
7

Sto lavorando su un gioco RMI a linea di comando, ma, ogni volta che provo al mio servizio, ricevo un errore come questo:Java RMI Collegare Eccezione: Il collegamento ha rifiutato di ospitare/timeout

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

Questo è la classe principale per il mio 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()); 
     } 
    } 
} 

il principale per il mio Client classe:

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

Qualche suggerimento?

risposta

10

Verificare se la porta 1099 è disponibile. Inoltre, non hai menzionato quale sistema operativo stai utilizzando e se hai avviato il registro prima dell'esecuzione del tuo server.

Questo RMI tutorial spiega:

Prima di avviare il motore di calcolo, è necessario avviare il registro RMI . Il registro RMI è una semplice funzione bootstrap denominata dal server che consente ai client remoti di ottenere un riferimento a un oggetto remoto iniziale .

Per impostazione predefinita, il Registro di sistema gira sulla porta 1099, come la tua. Come i rapporti del tutorial, basta aprire un prompt dei comandi (in Windows) o un terminale di shell (su un UNIX-like OS) e digitare:

Per Windows (uso javaw se inizio non è disponibile):

start rmiregistry 

Solaris OS o Linux:

rmiregistry & 

UPDATE

012.

Ho notato, seguendo il tutorial di Oracle e un mio progetto di tempo fa, che nella classe Server non è stato esportato l'oggetto nel runtime RMI. Poi si dovrebbe modificare queste righe:

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

perché i rapporti del tutorial:

Il metodo statico UnicastRemoteObject.exportObject esporta l'oggetto remoto in dotazione in modo che può ricevere invocazioni dei suoi metodi remoti da client remoti.

Inoltre, se si utilizza lo stesso host per un'invocazione RMI, non è necessario nella classe Client:

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

Semplicemente invocano:

Registry registry = LocateRegistry.getRegistry(); 

Perché Oracle Reports :

L'overload senza argomenti di LocateRegistry.getReg stero sintetizza un riferimento a un registro sulla macchina locale e sul Registro di porta di default , 1099. È necessario utilizzare un sovraccarico che ha un parametro int se il Registro viene creato su una porta diversa 1099.

+0

Nulla di ciò rappresenterebbe un timeout della connessione. – EJP

+2

una porta firewalled –

+0

@EJP Informazioni sul timeout della connessione, ho scritto: "Verifica se la tua porta 1099 è disponibile". Ciò significherebbe verificare se la porta è disponibile o protetta da firewall. La mia nota sull'avvio di rmiregistry è perché l'OP non ha scritto nulla a riguardo, e perché, a volte, la mancata esecuzione del servizio è la ragione di una connessione rifiutata. Se il Cliente desidera eseguire un metodo di Server, ma se il Server non è stato eseguito localmente con il servizio, il Cliente non eseguirà mai il metodo. –

0

Fai attenzione alle porte perché potrebbero essere bloccate per un firewall, ad esempio se lavori in un'area sicura come il tuo lavoro o l'università, l'amministratore potrebbe aver implementato alcune protezioni ...

0

Io non guarda come puoi ottenere questa eccezione da quel codice. Secondo il codice, il server e il client sono in esecuzione sullo stesso host e non si ottengono timeout di connessione all'interno dello stesso host.

Quindi, supponendo che non sia il tuo vero codice e stai cercando il registro corretto (argomento dell'host su getRegistry()), ti chiederei se 192.168.56.1 è l'indirizzo IP che ti aspetti di vedere data la tua topologia di rete. È un indirizzo LAN interno e se il tuo client è al di fuori della LAN dovrebbe cercare di connettersi a un indirizzo IP più pubblico. Se l'indirizzo non è quello che ti aspetti, ti rimando allo item A.1 on the RMI FAQ.

Problemi correlati