Проблема переподключения RMI - PullRequest
0 голосов
/ 31 декабря 2010

У меня странная проблема с 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 ]

1 голос
/ 31 декабря 2010

Когда вы звоните LocateRegistry.createRegistry, вы создаете новый реестр RMI на конкретном порту. Naming.rebind, с другой стороны, пытается зарегистрировать ваш объект в реестре по умолчанию на порту по умолчанию. Поэтому происходит сбой, поскольку на порте по умолчанию не существует реестра.

Попробуйте вместо этого:

Registry registry = LocateRegistry.createRegistry(port);
registry.rebind(serverStr, server);
0 голосов
/ 10 января 2011

Ваш сервер завершает работу. Сохраните результат createRegistry в статическую переменную.

...