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

192
20 марта 2018, 01:32

есть отдельный поток класс который работает с 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;
                      }
                  } 
              }
        }
Answer 1

Методы isConnected() и isClosed() в Java работают немного не так, как вы представляете.

Метод isConnected() возвращает true тогда, когда сокет хоть раз был connected. Даже если сокет уже давно закрыт, isConnected() будет true.

Метод isClosed() возвращает true, когда сокет был хоть раз закрыт. Если сокет никогда не был подключен, isClosed() вернет false, даже не смотря на то, что по факту он не открыт.

Следовательно, вот так вот можно проверить, подключен ли сокет к серверу на текущий момент времени.

boolean connected = socket.isConnected() && !socket.isClosed();
READ ALSO
java(fx) основы

java(fx) основы

Изучаю javaХочу вызвать в консоль текст, который написан в textField

148
Сихнронизация в WEB рипложении(Java Spring)

Сихнронизация в WEB рипложении(Java Spring)

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

193
java. Цикл for совершает по два прохода за раз

java. Цикл for совершает по два прохода за раз

ЗдравствуйтеНикак не могу понять, почему при следующем коде фор по два прохода за раз делает, когда я ожидаю один проход?

177