#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().