Ответ 1
Похоже, что все, что мы можем здесь сделать, - дать вам несколько советов по отладке, чтобы вы могли узнать больше о том, что вызывает проблему. Итак, вот список вещей, которые нужно изучить.
-
Убедитесь, что socket.io настроен для автоматического повторного подключения. В последних версиях socket.io автоматически включайте параметры по умолчанию, но вам может потребоваться убедиться, что никакая часть кода не отключает его.
-
Убедитесь, что клиент не собирается спать, так что все сетевые подключения становятся неактивными. Отключите связь.
-
В рабочем клиенте (перед его отключением) используйте вкладку "Отладчик Chrome", вкладку "Сеть", вкладку "Веб-сокеты", чтобы убедиться, что вы можете видеть регулярные сообщения ping между клиентом и сервером. Вам нужно будет открыть окно отладки, перейти на вкладку "Сеть", а затем обновить веб-страницу с открытием этого окна отладки, чтобы начать видеть сетевую активность. Вы должны увидеть интересный URL-адрес, в котором есть
?EIO=3&transport=websocket&sid=xxxxxxxxxxxx
. Нажмите на это. Затем щелкните субтег "Фреймы". В этот момент вы можете наблюдать за отправкой отдельных пакетов websocket. Вы должны видеть крошечные пакеты длиной 1 каждый раз в то время (это пакеты ping and pong keep-alive). Там примерный снимок экрана, который показывает, что вы ищете. Если вы не видите эти пакеты keep-alive, то вам нужно решить, почему их там нет (возможно, какая-либо проблема с конфигурацией или выпуском socket.io). -
Поскольку вы упомянули, что можете воспроизвести ситуацию, вам нужно знать, как закрывается сокет (инициируется клиентский конец или инициируется сервер). Один из способов собрать информацию об этом - установить сетевой анализатор на вашем клиенте, чтобы вы могли буквально следить за каждым пакетом, который проходит по сети, от вашего клиента. Существует много разных анализаторов, и многие из них свободны. Я лично использовал Fiddler, но я регулярно слышу, как люди говорят о WireShark. То, что вы хотите увидеть, - это именно то, что происходит в сети, когда клиент теряет свое соединение. Клиент решает отправить закрытый пакет сокетов? Получает ли клиент пакет закрытого сокета от кого-то? Что происходит в сети в момент потери соединения.
Просмотр сети в сети в отладчике Chrome