Лучший способ восстановить сервер после отключения клиента - PullRequest
1 голос
/ 09 ноября 2011

Я написал tcp сервер на Java. Он порождает рабочие экземпляры (Runnable) и прослушивает входящее tcp-соединение. При подключении от клиента он получает данные от клиента и выполняет свою собственную обработку.

В последнее время я заметил, что при отключении клиента происходит сбой всего сервера с ошибкой java.net.SocketException: сброс соединения при отключении или выходе клиента. Это было тогда, когда я понял, что не проверил tcp-сервер полностью на все случаи сбоя.

Я посмотрел код и заметил, что tcp-сервер потерпит крах в этой строке, пока ((bytesRead .... -1) в рабочем экземпляре

final int BUFFSIZE = 65535;
int bytesRead;
byte[] buffer = new byte[BUFFSIZE];
din = new BufferedInputStream(clientSocket.getInputStream());

while ((bytesRead = din.read(buffer)) != -1) {   //tcp server crashes at this line if client quits or disconnects.
// worker does its job.
}

Я размышлял о том, как лучше закрыть рабочий экземпляр, не вызывая сбой на tcp-сервере. У меня нет доступа к исходному коду клиента, чтобы что-то изменить на его конце.

Есть мысли?

Bregs Yakult121

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

Эта строка должна выдавать IOException, если соединение закрыто. Просто убедитесь, что перехватили IOException и вернитесь из метода run() вашего Runnable, когда это произойдет. Это остановит поток, обрабатывающий это клиентское соединение.

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

2 голосов
/ 09 ноября 2011

Сетевой ввод-вывод должен выполняться в блоке try / catch, если вы хотите обрабатывать исключения.

1 голос
/ 09 ноября 2011

разобрался в проблеме. Записать, что я сделал для любого человека, который хочет решить ту же проблему.

private boolean isStopped = false;

while (!isStopped()) {
   try {
      while ((bytesRead = din.read(buffer)) != -1) {   
         // worker does its job.
      }
   }
   catch (IOException ex) {
      System.out.println("Exception called! Most likely due to client disconnect!");
      stop();
   }
}

public boolean isStopped() {
    return this.isStopped;
} 

public synchronized void stop(){
    this.isStopped = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...