Как сервер может обнаружить, что клиент был отключен, и вызвать функцию в socket.on ('отключить') на стороне сервера.Подобно клиенту, он также имеет socket.on («отключение»), который будет запускаться на стороне клиента при закрытии сервера.Я установил очень высокий pingInterval и очень высокий pingTimeout на сервере, но, похоже, и сервер, и клиент могут обнаружить, что другой был немедленно отключен (по событию триггера (отключение)).
Aрегулярное отключение обнаруживается, когда TCP-соединение закрывается по какой-либо причине.Сервер увидит, что соединение TCP будет закрыто, когда веб-страница либо закроет соединение socket.io вручную, либо когда страница удалена, а браузер закроет все открытые соединения с этой веб-страницы.Таким образом, когда соединение работает нормально и затем закрывается клиентом или сервером, другой конец немедленно увидит закрытое соединение TCP.Это не имеет ничего общего с интервалами пинг-понга.Они используются для чего-то другого (описано ниже).
Поскольку сокет TCP все еще может быть технически подключен (еще не закрыт), но на самом деле может быть неработоспособен и больше не работать, для определения значения используются ping и pong.если соединение с таким открытым TCP-сокетом больше не работает.Если это так (не получая своевременного ответа от другой стороны от ping / pong), то сокет закрывается, и затем генерируется событие отключения.
О ping / pongпакет означает, что обе стороны (сервер и клиент) отправят «ping» другому и ждут ответа «pong» или единственная сторона сервера отправляет «ping» клиенту, а клиент отправляет обратно «pong» серверу, когдаполучает пакет «ping».
Я не могу найти какой-либо конкретной документации по этому вопросу, но похоже, что серверный код ожидает получения ping
сообщений от клиента, и он закроет соединение, если нетПинг или другой пакет данных получен в течение определенного периода времени ожидания.Как только сервер получает ping
, он немедленно отправляет pong
обратно клиенту.Таким образом, предположительно, клиент отправляет ping
и ищет ответ pong
в течение определенного периода времени.Если он не обнаружит ответ pong
в течение определенного времени, он закроет соединение на своем конце (и может попытаться восстановить соединение, в зависимости от конфигурации).