TLDR; пинг вашего сервера клиентом.
Вот как работает стек TCP: для корректного отключения требуется отправка пакета равноправному узлу. Если сеть не работает, передача данных невозможна.
Сеть Localhost обладает всеми знаниями об отключениях, но в реальной сети отсутствует информация обо всех движущихся частях.
Единственный надежный способ обнаружения отключения - это ожидание сообщения от однорангового узла (это может быть сообщение ping или обычный пакет данных) с тайм-аутом.
Если время ожидания истекло - одноранговый узел пропал, локальный конец канала связи также должен быть закрыт.
Вот почему любое долгоживущее общение по TCP немного сложнее, чем кажется - все системы производственного уровня используют пинг и тайм-ауты внутри. Это касается не только веб-сокетов, но и любых мессенджеров с пользовательским протоколом.