【问题标题】:RMI Reconnection ProblemRMI 重新连接问题
【发布时间】:2010-12-31 10:16:26
【问题描述】:

我对 RMI 有一个奇怪的问题。首先,我启动了服务器,然后我启动了客户端。第一次,我可以从客户端连接到服务器。然后我停止客户端。我尝试重新连接客户端。我可以获取服务器存根,但是当我从存根调用方法时,我得到了一堆 "Connection Refused" 异常。我没有打开防火墙。

我的服务器设置代码

public Server(String name, int port) {
        try {
            LocateRegistry.createRegistry(port);
            ServerModel server = new ServerModel();
            String serverStr = "rmi://localhost:" + port + "/" + name;
            Naming.rebind(serverStr, server);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RemoteException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
}

以及设置客户端的代码

public Client(String serverName, int port) throws RemoteException {
        controller = new ClientController();
        view = new MainView();
        ClientRegistry.setData(ClientConstant.FRONT_CONTROLLER, controller);
        try {
            String serverStr = "rmi://localhost:" + port + "/" + serverName;
            ServerInterface serverStub = (ServerInterface) Naming.lookup(serverStr);
            ClientRegistry.setData(ClientConstant.STUB, serverStub);
            view.setFrontController(controller);
            view.display();
        } catch (Exception ex) {
            // Show error if server is not available
            JOptionPane.showMessageDialog(null, "Server is not available", "Error", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
}

还有例外

java.rmi.ServerException:服务器线程发生RemoteException;嵌套异常是: java.rmi.ConnectException:连接拒绝主机:192.168.0.104

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    当您调用LocateRegistry.createRegistry 时,您会在特定端口上实例化一个新的 RMI 注册表。另一方面,Naming.rebind 尝试在默认端口上的“默认”注册表中注册您的对象。因此它失败了,因为默认端口上不存在注册表。

    试试这个:

    Registry registry = LocateRegistry.createRegistry(port);
    registry.rebind(serverStr, server);
    

    【讨论】:

    • 我已经根据您的建议对我的代码进行了更改,但是问题仍然存在。我可以在第一时间正常连接到服务器。但是,当我退出客户端并尝试重新连接到服务器时,出现“连接被拒绝”异常。
    【解决方案2】:

    您的服务器正在退出。将 createRegistry 的结果存储到静态变量中。

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2011-08-21
      • 2021-09-16
      • 1970-01-01
      • 2018-04-26
      • 2015-07-22
      • 2014-04-03
      • 2021-08-06
      • 2011-08-03
      相关资源
      最近更新 更多