Клиент какое-то время работает с сервером на сокетах.
Клиент принимает решение завершить работу(например, аварийное завершение повисшего приложения).
Как узнать со стороны сервера, что сокет больше не валидный и можно его отбросить?
socket.isClosed() на стороне сервера всегда возвращает false, даже если клиент уже вызвал socket.close() ?
Ответ
Метод isConnected поможет решить проблему. Возвращает TRUE, если клиент закрыл соединение.
public class MyServer {
public static final int PORT = 12345;
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT);
Socket s = ss.accept();
Thread.sleep(5000);
ss.close();
s.close();
}
}
public class MyClient {
public static void main(String[] args) throws IOException, InterruptedException {
Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT);
System.out.println(" connected: " + s.isConnected());
Thread.sleep(10000);
int read = s.getInputStream().read();
if(read == -1)
System.out.println("Socket disconnected");
else
System.out.println(read);
}
}
ps. если не ошибаюсь, если клиент отключился, то Input/OutputStream-ы вернут IOException
UPD
isConnected() -правда, если сокет был успешно подключен к серверу. Закрытие сокета не очищает состояние соединения, что означает этот метод возвращает истину для закрытого сокета (см IsClosed ()), если он был успешно подключен еще до закрытия.
isClosed() Возвращает закрытое состояние сокета. т.е. говорит вам закрыли ли вы этот сокет. Пока у вас есть, он возвращает ложь.
isConnected() -
если соединение закрыто, то
read() вернет -1, если нет данных с потока, например, недоступен или дошли до конца потока. Этот метод блокирует поток до тех пор, пока не будет прочитан весь поток, либо не будет достигнуn конц потока, либо выбросит исключение.
Замечание от @Regent: Если не указать timeout, то все зависнет на неизвестно сколько времени.
readLine() вернет null
тогда нужно проверить состояние след. образом:
int read = s.getInputStream().read();
if(read == -1)
System.out.println("disconnected");
else
System.out.println(read);
p.p.s isConnected() не скажет отвалился ли клиент.
Комментариев нет:
Отправить комментарий