Załóżmy, że mamy klasę serwera:
public class Server {
public static void main(String args[]) {
ServerSocket connecting = null;
Socket socket = null;
try {
connecting = new ServerSocket(8189);
System.out.println("Server is on");
}
catch (Exception e) {
System.out.println("Problem with server");
}
try {
socket = connecting.accept();
System.out.println("New user");
}
catch(Exception e) {
}
while (true) {
if (socket.isClosed()) {
System.out.println("Connecting is closed!");
}
else
{
System.out.println("Connecting is OK!");
}
}
}
}
Nowy użytkownik łączy się z serwerem - jest OK - otrzymujemy wiadomość New User
Jednak jak zrealizować to, żeby w przypadku rozłączenia użytkownika server o tym się dowiedział?
W powyższym kodzie próbowałem sprawdzać socket.isClosed() ale ten sposób nie działa - nawet w przypadku, gdy zamknę aplikacje klienta, to z tym socketem nic się nie dzieje. Musiałbym pewnie jawnie użyć wcześniej socket.close(), ale to z kolei jest ciężkie bo okoliczności zerwania połączenia mogą być różne. Niekoniecznie musi być to zamknięcie aplikacji przez usera, ale np problemy z internetem.
Zresztą zrzucenie odpowiedzialności na aplikacje klienta chyba nie jest najlepszym wyborem, może to powodować różne problemy - to serwer powinien co jakiś czas sprawdzać, czy podłączony użytkownik jest ciągle aktywny... Pewnie jest za to odpowiedzialna jedna prosta metoda...