RMI重新连接问题

时间:2010-12-31 10:16:27

标签: java rmi

我对RMI有一个奇怪的问题。首先,我启动了服务器,然后我启动了客户端。在第一次,我可以从客户端连接到服务器。然后我停止客户端。我试图重新连接客户端。我可以得到服务器存根,但是当我从存根调用一个方法时,我得到了一堆“拒绝连接”的例外。我没有打开防火墙。

我设置服务器的代码

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

2 个答案:

答案 0 :(得分:1)

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

请改为尝试:

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

答案 1 :(得分:0)

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