2014-10-30 1 views
0

Я пытаюсь реализовать сервер, который принимает подключения, но время ожидания, и закрывает только это конкретное соединение, если он ничего не получил от этого соединения после N миллисекунд.ServerSocket истекает время и выходит из серверной программы

Из-за возможного непонимания метода ServerSocketsetSoTimeout(int milliseconds), я думал, что это поведение может быть выполнено путем передачи N в setSoTimeout.

То, что я испытываю, когда клиент делает соединение и ничего не отправляет по этому соединению в течение N секунд, сервер ловит SocketTimeoutException, но затем полностью останавливает выполнение и завершает процесс, выполняющий серверную программу. Вот listen метод моего сервера:

private static void listen() throws IOException { 
    while(true) { 
     try { 
      Socket clientSocket = serverSocket.accept(); 
      Connection connexion = new Connection(clientSocket); 
      connexion.start(); 
     } catch (SocketTimeoutException e) { 
      System.out.println("Socket timed out!"); 
      break; 
     }   
    } 
} 

Я успешно поймать SocketTimeoutException, игнорировать это и предположить, что соединение с клиентом, который вызвал исключение закрывается (плохо я знаю!). Затем я просто выхожу из блока catch, чтобы продолжить прием других клиентских подключений. Что мне здесь не хватает?

ответ

0

Вам необходимо добавить continue; вместо break; в пункт try-catch. Сервер будет продолжать слушать.

0

Предполагается, что клиентское соединение, вызвавшее исключение, закрывается.

Неправильное предположение. accept() - это то, что истекло. Соединение с клиентом еще ничего не сделано.

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

Err, нет, вы вырваться из блока улова до остановки принятия других клиентских подключений. Вы выходите из цикла принятия.

Что мне здесь не хватает?

A continue вместо break.

Если вы не заботитесь о SocketTimeoutException, почему вы устанавливаете тайм-аут гнезда на ServerSocket? Просто удалите это.

+0

Есть ли способ установить тайм-аут на клиентском «Socket»? Есть ли метод класса «Socket», который позволил бы мне достичь желаемой функциональности? – cbrad

+0

Да, err, 'setSoTimeout()', тот же, который вы вызывали в 'ServerSocket'. Вы даже смотрели? – EJP

+0

Плохо, я, должно быть, пропустил метод 'SetSoTimeout'' Socket'; Я думал, что он доступен только для 'ServerSocket'. Еще раз спасибо за ваш информативный ответ @EJP – cbrad