Piszę aktualnie projekt systemu wykorzystującego komunikację klient-serwer, gdzie aplikacja serwera jest napisana w Javie i uruchamiana na PC, a klientami mogą być urządzenia z Androidem.
Komunikacja ma odbywać się w dwie strony, więc zrobiłem odbieranie wiadomości na jednym wątku i wysyłanie wiadomości na drugim (jest to strona kliencka, serwer obsługuje wielu takich klientów). Odbieranie jest blokujące, więc w każdej sytuacji, w której jedna ze stron zamknie gniazdo sieciowe mogę to łatwo wykryć - readLine() zwraca mi wtedy null. Do takich sytuacji można zaliczyć np. wyłączenie apki na Androidzie - gniazdo się zamyka, serwer dostaje null i również zamyka gniazdo, na którym się komunikował z tym klientem. Oczywiście nic nie zamyka się samo - to już kwestia mojej obsługi wyjątków.
Nurtuje mnie jednak kwestia wykrywania rozłączeń pomiędzy klientem i serwerem w następujących sytuacjach:
- Utrata połączenia ze strony serwera poprzez np. manualne rozłączenie z siecią (karta sieciowa -> połącz/rozłącz)
- zero wyjątków,
- serwer nie wie, że nie ma sieci
- klient nie wie, że w sieci nie ma serwera,
- Utrata połączenia ze strony serwera w przypadku awarii karty sieciowej lub jej wyłączenia
- serwer zamyka gniazdo do komunikacji z klientem i nie wyrzuca innych wyjątków, przez co działa sobie bez połączenia jakby nigdy nic, nie zamykając swojego gniazda serwerowego
- klient oczywiście znów o niczym nie wie,
- Utrata połączenia ze strony klienta poprzez np. wyłączenie wi-fi
- klient zamyka swoje gniazdo
- serwer o niczym nie wie, więc nie zamyka gniazda do komunikacji z klientem.
Jak rozwiązać te trzy przypadki, aby to wszystko miało swoją obsługę?