@daniil14056

Как отключить соединение с клиентом. isConnected() всегда true?

Как соккет клиента отключить на сервере. isConnected(); всегда true. При каких условиях она false вообще бывает? Хоть увидеть бы.
public void disconnectClient(){
         connected=false;
        try{ 
           
            if(client!=null){
               printServer.print("Client "+address+ " disconnect\n"); 
                printServer.flush();
                client.close();
            }    
        }catch(IOException ex){}   
      
        synchronized(connections){
         
            connections.remove(this.address);
        }
        
    }

Метод чтения плюс проверка каждую секунду статус потока Сокета Клиента. Вообщем ошибок нет, но почему поток socket всегда true будет показывать, и как обьект подключения клиента
очистить. Он же в памяти вести. И как его убить на false скинуть, вообще как, должен же быть метод типa disconnect();
(new Thread(){   // для демонстрации проблемы только 
          public void run(){
              while(client.isConnected()){
              System.out.println(client.isConnected(); // вечное true ни как не зависит от клиента
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException ex) {
                  System.out.println(ex);
              }
              }
          }
      }).start();
  try{
            while((line=bis.readLine())!=null){
                if(line.equalsIgnoreCase("exit")){
                     disconnectClient();
                    return;
                }
            // .....
        }catch(IOEcxeption ex){
            disconect();
        }
  • Вопрос задан
  • 239 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Из документации:
Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket (see isClosed()) if it was successfuly connected prior to being closed.


Как должен выглядеть disconnect() зависит от используемого протокола. Правильная последовательно действий - уведомить клиента о закрытии соединения, вызвать close() клиентского сокета и удалить ссылку на него.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы