Страницы

Поиск по вопросам

среда, 17 апреля 2019 г.

Как закрыть Socket?

есть отдельный поток класс который работает с Socket-ом.Когда я отключаю клиент он все равно продолжает работать. Метод socket.isClosed() возвращает false а socket.isConnected() true хотя клиент давно уже отрублен.Как можно закрыть этот Socket? Есть мысли отправить сигнальный текст из клиента чтобы закрыть соединение типа :
String line = bufferedReader.readLine(); if(line.equals("exit")){ socket.close(); }
но я не могу использовать readLine() так как из клиента я отправляю только тогда когда получаю данные от сервера.Как это можно реализовать?помогите пожалуйста.Вот код который есть сейчас.На самом деле кода тут очень много ,я написал самую главную логику.
@Override public void run() {
try(PrintWriter out = new PrintWriter(socket.getOutputStream(),true); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream(), Charset.forName("cp1251")))){
while(true) {
out.println("soobshenie s servera"); out.flush();
if((socket.isClosed())||(!socket.isConnected())){ socket.close(); System.out.println("поток завершен"); break; } } } }


Ответ

Методы isConnected() и isClosed() в Java работают немного не так, как вы представляете.
Метод isConnected() возвращает true тогда, когда сокет хоть раз был connected. Даже если сокет уже давно закрыт, isConnected() будет true
Метод isClosed() возвращает true, когда сокет был хоть раз закрыт. Если сокет никогда не был подключен, isClosed() вернет false, даже не смотря на то, что по факту он не открыт.
Следовательно, вот так вот можно проверить, подключен ли сокет к серверу на текущий момент.
boolean connected = socket.isConnected() && !socket.isClosed();

Комментариев нет:

Отправить комментарий