Уничтожение потока после закрытия сокета - PullRequest
1 голос
/ 22 марта 2012

Я хочу уничтожить поток слушателя TCP-соединения (на стороне сервера) после того, как клиент закроет сокет. Поток ожидает в цикле в readLine () .. Как я могу это сделать?

while(isconnected){
String msg = in.readLine();
//..
}

Ответы [ 5 ]

3 голосов
/ 22 марта 2012

Вы должны вызвать метод socket.close (), если вы используете его правильно, все должно быть в порядке. Я не знаю, откуда взялась readLine (), поэтому я предполагаю, что это BufferedReader. Если вы посмотрите здесь в документации BufferedReader readLine ()

вы увидите, что он генерирует IOException, если есть ошибка, и если это конец потока, он вернет ноль.

так что вы должны сделать это:

try{
  while(socket.isConnected()){
    String line = in.readLine();
    if(line==null){
      //END OF STREAM
    }
  }
}catch(IOException e){
  //deal with IOException here
}

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

1 голос
/ 22 марта 2012

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

0 голосов
/ 22 марта 2012

WalterM в основном прав.Вызов readLine вернет null, если поток закрыт удаленным клиентом, и выдаст исключение, если соединение «обрывается» без надлежащего закрытия или истекает время ожидания сокета низкого уровня.

Стоит отметить, что сделать это проще и эффективнее:

try {
    String msg;
    while ((msg = in.readLine()) != null) {
        // do stuff
    }
} catch (IOException ex)
    // report error
} finally {
    // Close the socket under all circumstances to avoid potential
    // resource leakage
    try {
        socket.close();
    } catch (IOException ex) {
        // ignore
    }
}

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

0 голосов
/ 22 марта 2012

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

Что вы можете сделать, это установить некоторый период ожидания и создать поток на сервере, который вызывает clientSocket.close() после истечения времени ожидания. Это создаст исключение SocketException в получающем потоке. Он выведет вас из цикла приема, и поток просто завершится сам, если после цикла получения ничего не будет.

0 голосов
/ 22 марта 2012

Вам нужно прервать поток.

...