Java RMI RemoteException после отправки последнего сообщения - PullRequest
0 голосов
/ 17 ноября 2011

Итак, я создал пару клиент / сервер в Java, используя RMI. Суть в том, чтобы отправлять сообщения от клиента на сервер и распечатывать, сколько сообщений мы получили и сколько мы потеряли (я сравниваю это с UDP, поэтому не спрашивайте, почему я ожидаю потерять что-либо с RMI).

Так или иначе, написав код, кажется, все работает нормально, я привязываюсь к серверу и отправляю сообщения, сервер получает их все и выводит результаты.

Единственная проблема в том, что после того, как я отправил последнее сообщение от клиента, он выдает RemoteException, и я понятия не имею, почему.

Мое единственное предположение, что сервер выключил кулак, поэтому он сообщает мне, что я больше не могу связаться с сервером (т.е. моя переменная iRMIServer теперь недопустима).

Забавно, я думал, что клиент сначала отключится, потому что он завершает работу после отправки сообщений. Причина, по которой он может не завершиться первым, заключается в том, что ему приходится ждать ответа (ACK) от сервера, чтобы подтвердить получение сообщения ??

Возможно, в это время, когда сервер отвечает, чтобы сообщить нам, что все в порядке, сервер отключается, и мы не можем подключиться к нему снова.

Код для отправки сообщений на стороне клиента выглядит следующим образом:

   try { 
         iRMIServer = (RMIServerI) Naming.lookup(urlServer); 

         // Attempt to send messages the specified number of times 
         for(int i = 0; i < numMessages; i++) { 
            MessageInfo msg = new MessageInfo(numMessages,i); 
            iRMIServer.receiveMessage(msg); 
         } 
    } catch (MalformedURLException e) { 
        System.out.println("Errpr: Malformed hostname."); 
    } catch (RemoteException e) { 
        System.out.println("Error: Remote Exception."); 
    } catch (NotBoundException e) { 
        System.out.println("Error: Not Bound Exception."); 
    } 

Таким образом, это отправляет сообщения с 0-999, если я выбираю 1000 сообщений для отправки.

После распечатки результатов с сервера я сразу вызываю System.exit (), что может привести к преждевременному завершению работы без ожидания соответствующих ответов от клиента?

Если вы можете помочь, я буду очень признателен, и если вам понадобится дополнительная информация, я с удовольствием предоставлю.

Заранее спасибо.

1 Ответ

0 голосов
/ 18 ноября 2011

Вы не можете выключить сервер в середине удаленного метода.Сервер должен отправить обратно статус OK или состояния исключения, или возвращаемое значение, если метод имеет его, и это то, что ваш клиент терпит неудачу при попытке получить.Вы должны запланировать отключение чуть позже.

...