Java RMI NoSuchObjectException

#java #rmi #clients

#java #rmi #клиенты

Вопрос:

У меня есть сервер и клиент, использующие Java RMI. Если я использую один клиент, с приведенным ниже кодом все в порядке. Но если я подключаюсь к клиенту, а затем ко второму, он выдает исключение port already in use. Все в порядке, поэтому я отключаю подключенный клиент, а затем снова пытаюсь подключиться ко второму клиенту. Это дает мне это:

java.rmi.NoSuchObjectException: такого объекта в таблице нет

Почему это?

 //CONNECT

Registry registry = LocateRegistry.getRegistry(
    Options.getRegistryIp(), Options.getRegistryPort());
server = (IServer) registry.lookup(Constants.MB_SERVER_NAME);

UnicastRemoteObject.exportObject(client, Options.getMyPort());
server.registerClient(client);

//DISCONNECT

server.removeClient(client, client.getUser());
UnicastRemoteObject.unexportObject(client, false);
  

Ответ №1:

NoSuchObjectException означает, что заглушка ссылается на удаленный объект, который не был экспортирован, либо явно, либо через GC. Получаете ли вы это при поиске (), или registercient(), или removeClient()?

Комментарии:

1. Я получаю это в первой строке registerClient(), когда сервер пытается получить имя пользователя объекта клиента. Но я не вижу, как это было неэкспортировано явно, потому что строка выше просто экспортировала объект, и больше ничего не происходит… Если я использую два клиента и подключаюсь к одному, затем к другому, это приведет к использованию порта. Если я отключусь от первого клиента и выйду, а затем снова подключусь ко второму клиенту, он будет работать без каких-либо проблем. Просто, если я отключу первый клиент без выхода, я получу эту ошибку.

2. Кстати, я запускаю все клиенты / серверы на локальном хосте 127.0.0.1, но завтра я попробую использовать другие компьютеры. Если я использую разные порты для клиентов, проблем не возникает.

3. Попробуйте получить результат exportObject(), который является заглушкой, и передать это в server.registercient().