RMI ConnectException:连接被拒绝,行为真的很奇怪

时间:2012-12-09 21:27:42

标签: java rmi

我知道已经多次询问过这个问题,但我还没有找到适合我的答案。基本上我已经使用RMI实现了客户端/服务器解决方案。我唯一的问题是与服务器的连接有时非常慢。

当服务器启动并且客户端连接时,它第一次连接它需要几秒钟(有时它甚至没有连接但是却得到了ConnectException)之后我会在尝试时拒绝连接与服务器通信。 更令人难以置信的是,当我断开第一个失败的客户端并再次连接时,它工作得很好。客户端然后在一秒钟内连接,所有通信工作完美无瑕。

我尝试过手动启动rmiregistry,我已经仔细检查了我的PATH。我无法使用telnet连接到端口,但是当我使用我的Othello游戏(不使用RMI)在该端口上玩时,它可以正常工作。值得一提的是,我在同一个网络和计算机上这样做,所以我使用的是localhost。

TL; DR:当我第一次连接到服务器时,它需要永远,但我能够连接。当我尝试与方法进行通信时崩溃,我收到“java.rmi.ConnectException:Connection拒绝主机:192.xxx.xxx.x;嵌套异常是:     java.net.ConnectException:连接超时:连接“。如果我然后关闭该客户端并尝试连接另一个客户端需要大约一秒钟才能连接,然后一切都运行完美。为什么会这样?

客户代码:

public class NetworkClient {
private Registry registry;
private IArenaServer server;

public NetworkClient(String ipAddress, int port) throws RemoteException {

    if (System.getSecurityManager() == null) {
        System.setSecurityManager(new RMISecurityManager());
    }

    try {

        registry = LocateRegistry.getRegistry(ipAddress, port);
        server = (IArenaServer)(registry.lookup("arenaServer"));
        System.out.println("Client successfully connected to server at " + ipAddress + ":" + "port");

    } catch (NotBoundException ex) {
        Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex);
    } catch (AccessException ex) {
        Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex);
    }
}

服务器代码:

public class ArenaServer extends UnicastRemoteObject implements IArenaServer {

private int port = 9029;
private String ipAddress;
private Registry registry;

public ArenaServer() throws RemoteException {

    if(System.getSecurityManager() == null){
        System.setSecurityManager(new RMISecurityManager());
    }

//  try {
        //ipAddress = (InetAddress.getLocalHost()).toString();
        registry = LocateRegistry.createRegistry(port);
        registry.rebind("arenaServer", this);

        System.out.println("Server successfully started...");
        //System.out.println("Server's IP address is: " + ipAddress);

//  } catch (UnknownHostException ex) {
//      ErrorHandler.getInstance().reportError("Cannot get IP address", "");
//  }
}

第一次连接后尝试与服务器通信时得到的一般示例:

java.rmi.ConnectException: Connection refused to host: 192.xxx.xxx.x; 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 $Proxy0.getInstalledGames(Unknown Source)
....

1 个答案:

答案 0 :(得分:1)

这听起来像java.rmi.server.hostname的情况。请参阅RMI FAQ中的A.1项,可通过RMI主页访问。