2013-10-06 5 views
0

Я делаю событие для отключения клиента. Вот мой код:Отправка события для закрытого сокета

public void run(){ 
    while(isConnected()){ 
     System.out.println("asd");   
    } 
    serverListener.clientDisconnect(clientID); 
} 

public boolean isConnected(){ 
    if(socket.isClosed() || !socket.isConnected() || socket.isInputShutdown() || socket.isOutputShutdown()){ 
     return false; 
    } 
    return true; 
} 

Проблема у меня есть эти результаты:
IsClosed = ложь
IsConnected = истина
IsInputShutdown = ложь
IsOutputShutdown = ложный

И когда клиент отключается, у меня такой же результат: ничего не происходит.

+0

У вас нет способа узнать, что сокет закрыт на другом конце. Вы должны использовать тайм-аут сокета с каждой стороны. Обычно я использую тайм-аут сокета и отправляю keep-alive каждые X секунд – galchen

ответ

1

Это правильно. Эти флажки рассказывают вам о том, что вы сделали.

Вы не закрыли соединение, оно было подключено один раз, вы не отключили вход или выход.

Единственный способ узнать, закрыто ли соединение, когда вы не можете прочитать из гнезда. (Или ваш Селектор уведомляет вас)

Примечание: только потому, что другой конец закрыл соединение, не означает, что вы хотите закрыть. Представьте, что у вас есть HTTP-запрос, и ваш сервер отправляет вам ответ и закрывает соединение. Вы хотите, чтобы соединение закрылось, даже если вы не прочитали все данные в какой-то случайной точке, возможно, до того, как закончите или даже начнете? Вы этого не сделаете, вы хотите знать, что он был закрыт, как только вы прочли все данные.

+0

Я исправляю сейчас! Исправить прямо сейчас: общественной недействительным Run() { время (правда) { если (packetType == 1) { попытка { String String = GetString(); serverListener.readString (строка); } catch (IOException e) { break; } } else if (packetType == 2) { try { byte [] bytes = getByteArray(); serverListener.readByteArray (байты); } catch (IOException e) { break; } } } serverListener.clientDisconnect (clientID); } – Dementor

0

Проверьте, что происходит с этим кодом:

public void run(){ 
    while(true){ 
     if(packetType == 1) { 
      try { 
       String string = getString(); 
       serverListener.readString(string); 
      } catch (IOException e) { break; } 
     } else if(packetType == 2){ 
      try { 
       byte[] bytes = getByteArray(); 
       serverListener.readByteArray(bytes); 
      } catch (IOException e) { break; } 
     } 
    } 
    serverListener.clientDisconnect(clientID); 
} 
+0

Что? Что? – Dementor

+1

Это работает на 100% штрафа – Dementor

Смежные вопросы