сервер сокетов Java, сервер обнаружения клиента умер - PullRequest
3 голосов
/ 21 июля 2009

Если я завершу процесс Socket Server, мой процесс клиента Socket не получит никаких ошибок, он продолжит цикл навсегда для следующего кода:

public void run() {
    while(readData) {
      String inputLine = null;
      try {
        while((inputLine = m_inputStream.readLine()) != null) {
          //do stuff
        }
      } catch (IOException e) {
         readData = false;
     }
  }
}

Как я могу определить, что сервер сокетов пропал, и завершить цикл?

Ответы [ 2 ]

4 голосов
/ 21 июля 2009

Завершает внешний цикл , когда вызов readLine() возвращает null.

Нет исключений, когда сервер нормально закрывает соединение. Поток должен вернуть null, чтобы сигнализировать об окончании данных.

Это можно сделать с помощью такого цикла:

public void run() {
  try {
    while (true) {
      String line = input.readLine();
      if (line == null)
        break;
      /* Process line. */
      ...
    }
  } catch (IOException ex) {
    /* Handle the exception as desired. */
    ex.printStackTrace();
  }
}
0 голосов
/ 21 июля 2009

Хотя ответ от erickson правильный, вы пытались установить свойства времени ожидания чтения сокета ? (например, sun.net.client.defaultReadTimeout). Если возможно, что сервер может долго отвечать, то это может быть менее полезно в качестве решения вашей проблемы, но, тем не менее, является хорошей идеей во многих сценариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...