2009-06-01 5 views
4

J'ai une application client/serveur rmi très simple. Je n'utilise l'application « rmiregistry » bien, je l'utiliser pour créer le serveur:java Connexion RMI au serveur

server = new RemoteServer(); 
registry = LocateRegistry.createRegistry(PORT); 
registry.bind("RemoteServer", server); 

La partie client est:

registry = LocateRegistry.getRegistry(IPADDRESS, PORT); 
remote = (IRemoteServer) registry.lookup("RemoteServer"); 

Voici le problème fascinant: L'application fonctionne parfaitement lorsque Le serveur et le client s'exécutent dans mon réseau local (privé). Dès que je mets le serveur sur un serveur public, l'application se bloque pendant une minute, puis me donne l'erreur suivante:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.ConnectException: Connection refused to host: 192.168.x.y; nested exception is: 
    java.net.ConnectException: Connection timed out: connect 
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 
    at sun.rmi.transport.Transport$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source ... (the rest is truncated) 

La clé que je pense est que le client (en cours d'exécution sur mon réseau privé) ne peut pas se connecter à me (mon adresse est 192.168.xy où xy est d'autres chiffres, mais le vrai message d'erreur indique mon adresse IP indiquée là)

Si je tue le serveur rmi sur l'Internet, je reçois instantanément une message "connection denied to host: abcd"), donc je sais que quelque chose au serveur fonctionne au moins.

Des suggestions?

EDIT: juste pour rendre ceci un peu plus clair: 192.168.x.y est l'adresse du client, a.b.c.d est l'adresse du serveur. Le stacktrace montre que le client ne peut pas se connecter au client.

+0

Utilisez-vous callbacks client RMI? –

Répondre

1

192.168. * Contient des adresses IP privées (tout comme 10. *). Ceux-ci ne seront pas acheminés sur Internet ouvert. Vous devez vous assurer que vous utilisez une adresse IP publique pour le serveur et que tous les pare-feu (y compris NAT) sont configurés pour l'accès. Vous pouvez faire une vérification rapide avec telnet sur le port requis.

+0

Oui, je comprends cela, et telneting au serveur public rmi fonctionne: mais ma question je suppose est pourquoi le client ne parvient pas à se connecter, puis montrant mon adresse dans la trace de la pile? Si le client se connecte au serveur, pourquoi l'adresse du client est-elle affichée dans la pile? – user85116

0

Je crois que le serveur essaie d'ouvrir une socket au client et il échoue, et l'exception est un peu floue sur son libellé.

RMI n'est pas très NAT-friendly, IIRC.

3

Essayez d'exécuter le serveur avec ce paramètre pour la machine virtuelle:

-Djava.rmi.server.hostname=hostname_of_the_server 
Questions connexes