J'ai utilisé RMI dans ce projet pendant un certain temps. Je suis devenu le programme client de se connecter (entre autres) au serveur lors de l'exécution sur mon réseau local il, mais lorsqu'il est exécuté sur Internet, je suis en cours d'exécution dans l'exception suivante:Java RMI ne peut pas se connecter à un hôte à partir d'un client externe
java.rmi.ConnectException: Connection refused to host: (private IP of host machine); nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at $Proxy1.ping(Unknown Source)
at client.Launcher$PingLabel.runPing(Launcher.java:366)
at client.Launcher$PingLabel.<init>(Launcher.java:353)
at client.Launcher.setupContentPane(Launcher.java:112)
at client.Launcher.<init>(Launcher.java:99)
at client.Launcher.main(Launcher.java:59)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 12 more
Cette erreur est Je me souviens de ma première implémentation de RMI et je peux obtenir l'erreur verbatum si j'exécute le client localement sans que le programme serveur ne fonctionne aussi. Pour moi, la connexion expirée signifie un problème avec la réponse du serveur.
Voici l'initiation du client:
public static void main(String[] args)
{
try
{
String host = "<WAN IP>";
Registry registry = LocateRegistry.getRegistry(host, 1099);
Login lstub = (Login) registry.lookup("Login Server");
Information istub = (Information) registry.lookup("Game Server");
new Launcher(istub, lstub);
}
catch (RemoteException e)
{
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
catch (NotBoundException e)
{
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
Il est intéressant aucune exception à distance est lancé ici. est ici le début du serveur:
public static void main(String args[])
{
try
{
GameServer gobj = new GameServer();
Information gstub = (Information) UnicastRemoteObject.exportObject(
gobj, 1099);
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("Game Server", gstub);
LoginServer lobj = new LoginServer(gobj);
Login lstub = (Login) UnicastRemoteObject.exportObject(lobj, 7099);
// Bind the remote object's stub in the registry
registry.bind("Login Server", lstub);
System.out.println("Server ready");
}
catch (Exception e)
{
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
pratique Bad avec le catch (Exception e) Je sais, mais ours avec moi.
Jusqu'à ce stade, je sais que cela fonctionne très bien sur le réseau local, voici où l'exception se produit sur le réseau étendu et est la première place une méthode dans le serveur est appelé:
private class PingLabel extends JLabel
{
private static final long serialVersionUID = 1L;
public PingLabel()
{
super("");
runPing();
}
public void setText(String text)
{
super.setText("Ping: " + text + "ms");
}
public void runPing()
{
try
{
PingThread pt = new PingThread();
gameServer.ping();
pt.setRecieved(true);
setText("" + pt.getTime());
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
}
C'est une étiquette placée sur le lanceur comme test ping. la méthode ping(), dans gameserver ne fait rien, comme dans est une méthode nulle.
Il convient également de noter que les ports 1099 et 7099 sont transmis à la machine serveur (ce qui devrait être évident à partir de la trace de la pile).
Quelqu'un peut-il voir quelque chose que je manque/mal faire? Si vous avez besoin de plus d'informations, il suffit de demander.
EDIT: Je suis pratiquement certain que le problème n'a rien à voir avec les paramètres de mon routeur. Lorsque vous désactivez mes paramètres de redirection de port, je reçois une erreur légèrement différente:
Client exception: java.rmi.ConnectException: Connection refused to host: (-WAN IP NOT LOCAL IP-);
mais il apparaît à la fois sur la machine connecté localement au serveur et sur la machine distante. En outre, je l'ai eu à travailler de façon transparente lors de la connexion du serveur directement au modem (découpe du routeur.) Je peux seulement conclure que le problème est dans les paramètres de mon routeur, mais je ne vois pas où (J'ai vérifié et Vérifiez la redirection de port page) .C'est la seule réponse que je peux trouver
Êtes-vous sûr à 100% que vous pouvez vous connecter au port 1099 et 7099 sur la machine cible à travers le réseau? Avez-vous essayé de vous connecter au port depuis la machine source pour tester la connexion? Essayez 'telnet 1099' par exemple. S'il se connecte, alors la connexion est bonne - sinon vous devez regarder ce qui bloque la connexion. –
Je ne peux pas le tester maintenant mais avec mon adresse IP locale étant listée dans la trace de la pile, j'aurais pensé que la connexion fonctionnait (dans une certaine mesure). – Herrad