1

更新:

问题是,我正在使用一种 2 路连接。

在客户端,这有效:

String a = this.lobby.getMsg();

这不是:

this.lobby.login((Player)UnicastRemoteObject.exportObject(player, 0));

和想法?



我正在开发一个使用 RMI 进行网络通信的 java 应用程序。

在一台计算机上一切正常,但如果我尝试通过互联网运行它,我遇到了问题。

看来,客户端能够从服务器检索注册表并查找大厅对象。但是如果客户端尝试通过 rmi 调用大厅对象的登录方法,则需要很长时间,并且我收到以下异常:

奇怪的是,这个异常中提到了错误的 ip(客户端 ip)。如果我在与服务器相同的机器上运行客户端,它会完美运行。

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.ConnectException: Connection refused to host: <client ip(should be server ip?)>; nested exception is: 
    java.net.ConnectException: Die Wartezeit für die Verbindung ist abgelaufen (=time out)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:353)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at sun.rmi.transport.Transport$1.run(Transport.java:174)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at $Proxy0.einloggen(Unknown Source)
    at Client.login(Client.java:64)

以下是相关代码:

我的服务器类:

    public static final int RMI_PORT = 55555;
    public static final String SERVER_IP = "xyz.com";

    /**
     * Startet Spielserver
     * 
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("Server starten..");

        System.setProperty("java.rmi.server.hostname", SERVER_IP);
        try {
            if (System.getSecurityManager() == null) {
                System.setSecurityManager(new RMISecurityManager());
            }

            Registry registry = LocateRegistry.getRegistry(SERVER_IP, RMI_PORT);

            Lobby lobby = new LobbyImpl();
            UnicastRemoteObject.exportObject(lobby, 0);
            registry.bind("Lobby", lobby);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            e.printStackTrace();
        }
    }

客户端类:

public Client() {
        try {
            Registry registry = LocateRegistry.getRegistry("xyz.com", Server.RMI_PORT);
            lobby = (Lobby) registry.lookup("Lobby");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        }
        this.gui = new GUI(this);
    }

    public void login(String name) throws RemoteException {
        Player player = new Player(name);
        this.lobby.login((Player)UnicastRemoteObject.exportObject(player, 0));  
    }

客户端启动脚本:

#!/bin/bash
SCRIPTDIR=$(dirname $0)
java -classpath $SCRIPTDIR/bin Client

服务器启动脚本:

#!/bin/bash
SCRIPTDIR=$(dirname $0)

cd ${SCRIPTDIR}/bin
rmiregistry 55555 &
cd - 
java -classpath $SCRIPTDIR/bin -Djava.security.policy=$SCRIPTDIR/src/server.policy -Djava.rmi.server.codebase=file:$SCRIPTDIR/bin/ Server
killall rmiregistry

最后但并非最不重要的是我的第一个(测试)策略文件:

grant {
    permission java.security.AllPermission;
};

可能是什么问题呢?

问候

4

2 回答 2

2

您需要查看 RMI 主页上的 RMI FAQ 的 A.1 项。这里的问题是错误的 IP 地址被嵌入到远程存根中。因此查找有效,因为您在客户端中自己指定目标 IP 地址,但是当您执行远程方法时,您依赖于存根中的 IP 地址,这是错误的。解决方案是更正您的 /etc/hosts 文件或在服务器 JVM 上设置系统属性 java.rmi.server.hostname。

于 2012-06-27T12:00:57.503 回答
0

错误信息是

java.rmi.ConnectException: Connection refused to host: <wrong ip of the server>;

我会检查您是否可以 ping 该服务器和 telnet 到服务点。

于 2012-06-27T11:19:33.810 回答