Wydaje mi się, że sytuację, którą opisujesz nie należy traktować jako wyznacznik tego, czy klient jest podłączony czy nie. To co opisujesz to jest nieoczekiwane zerwanie połączenia przez klienta. Poprawnie, z tego co się orientuje trzeba robić tak, że jeśli klient kończy połączenie to wysyła do serwera komunikat "Hej rozłączam się". Jest to wtedy poprawna forma skończenia połączenia.
A to co opisujesz to jest sytuacja kiedy klient nagle zostanie zerwany bo np. ktoś wyjął kabel od internetu i dla serwera nie jest to sytuacja normalna tylko wyjątkowa. Do takich celów zostały własnie przygotowane wyjątki IOException. Jeśli read czy write rzuca taki wyjątek oznacza, że klient'a nie ma. Bo nie można tego zrobić w ten sposób, że przed użyciem np. writeObject, zrobisz sobie if'a w stylu, "jeśli klient jest podłączony, to zrób write", bo co jeśli przesyłasz np. duży obiekt, zajmujący np. 1GB i w trakcie wysyłki po przesłaniu 100MB ktoś odłączy kabel od sieci.
Metoda isConnected z tego co zrozumiałem ze stacka zwraca true jeśli chociaż raz udało się uzyskać połączenie. W dokumentacji np. jest takie zdanie:
Note: 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.
Czyli z tego wynika, że podłączając się pomyślnie do gniazda, po jego zamknięciu isConnected dalej będzie zwracało true, bo zostało zarejestrowanie pomyślne połączanie .
Dlatego jeśli potrzebujesz w aplikacji mechanizmu, który będzie Ci sprawdzał czy dany klient jest podłączony (w sensie jako funkcjonalność tzn. np. przycisk sprawdzający czy klient jest online) to chyba trzeba do tego celu napisać coś na zasadzie pinga. Wysyłasz po prostu do klienta wiadomość w stylu, "Hej czy jesteś", on odpowiada "Tak" lub rzuca wyjątek (IOException) w przypadku gdy wiadomość nie dotrze. A w aplikacji po prostu będziesz musiał obsłużyć ten wyjątek w taki sposób aby wyświetlany był komunikat, że klient jest w stanie offline.
Niestety, albo "stety", Socket i SocketServer to mechanizmy dość niskopoziomowe i pewne rzeczy trzeba samemu ogarniać, jak np. własnie to co Ty masz.