Java-RMI keine Verbindung zum host hergestellt aus externen client

Ich habe mit RMI in diesem Projekt für eine Weile. Ich habe das client-Programm zu verbinden (unter anderem) an den server, wenn es läuft über mein LAN, aber wenn es läuft über das internet, ich bin mit in die folgende Ausnahme:

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

Dieser Fehler ist remeniscent meiner frühen Implementierung von RMI und ich erhalten den Fehler verbatum wenn ich den client lokal ohne server-Programm läuft, wie gut. Mir Connection Timed Out bedeutet, das ein problem mit der server-Antwort.

Hier ist der client Einleitung:

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

Interessanterweise keine Remote-Ausnahme wird ausgelöst, hier.
Hier ist die server Einweihung:

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

Schlechte Praxis mit dem catch(Exception e) ich weiß, aber Geduld mit mir.

Bis zu diesem Zeitpunkt weiß ich, es funktioniert über LAN, hier, wo die exception Auftritt, die über das WAN und ist der erste Ort, eine Methode, die in der server heißt:

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

Das ist ein Etikett, platziert auf dem Startbildschirm als ping-test. die Methode ping(), in gameserver die nichts tut, als in ein null-Methode.

Es ist außerdem erwähnenswert, dass die ports 1099 und 7099 werden an die server-Maschine (die sollte offensichtlich sein, von der stack-trace).

Kann jemand sehen, anyting mir fehlt/falsch? Wenn Sie weitere Informationen benötigen einfach Fragen.

EDIT: ich bin praktisch sicher, dass das problem nichts zu tun hat mit meinen router-Einstellungen. Beim deaktivieren meiner port-forwarding-Einstellungen habe ich eine etwas andere Fehlermeldung:

Client exception: java.rmi.ConnectException: Connection refused to host: (-WAN IP NOT LOCAL IP-);

aber es scheint, sowohl auf dem Computer lokal an den server angeschlossen und auf der remote-Maschine.

Außerdem, ich habe es auf Arbeit nahtlos anschließen, wenn der server gerade tho das modem (Ausschneiden der router. Ich kann nur zu dem Schluss kommen, das problem ist in meinem router-Einstellungen, aber nicht sehen kann, wo (habe ich kontrolliert und überprüft, der port-forwarding-Seite). Das ist die einzige Antwort, die ich mit oben kommen kann.

  • Bist du dir 100% sicher, Sie können eine Verbindung zu port 1099 und 7099 auf dem Ziel-Computer aus über das Netz? Haben Sie versucht, die Telnetverbindung zu Port den port aus der Quelle-Maschine, um die Verbindung zu testen? Versuchen telnet <target ip> 1099 zum Beispiel. Wenn es eine Verbindung herstellt, dann die Verbindung in Ordnung ist - ansonsten müssen Sie schauen in das, was die Verbindung blockiert.
  • Ich kann das nicht testen Sie es jetzt aber mit meiner lokalen IP aufgelistet wird, in den stack-trace, ich hätte gedacht, dass die Verbindung funktioniert (teilweise).
InformationsquelleAutor Herrad | 2010-06-15
Schreibe einen Kommentar