2013-03-01 2 views
4

Как сервер знает, как закрыть соединение с веб-сокетом в HTML5 в следующих сценариях и в других случаях.HTML 5 - Веб-сокеты в браузере закрыты

  1. браузер внезапно закрыт
  2. Browser Refresh (новое создание соединения сокет или еще будет использовать существующие подключения)
  3. системы скачкообразное питание
+0

Оформить Держите в живых. http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html – nycynik

ответ

0

Простейшим часть вашего вопроса браузер обновить часть. IE, FF и Chrome закроют открытое соединение и откроют новый. Я думаю, что любой другой браузер сделает то же самое.

Точка 1 и 3 Я могу только догадываться: если клиент все еще может закрыть соединение tcp, сервер сразу же узнает, что соединение было закрыто. Если вы используете tomcat, вызывается метод onClose экземпляра MessageInbound.

Если клиент не смог закрыть соединение tcp, сервер будет ожидать какого-то таймаута. Сервер, безусловно, быстро перегрется, когда попытается что-то записать в сокет. Для этого вы можете реализовать механизм сердечного ритма. Кажется, что у Websockets есть возможность автоматического биения, но не все браузеры и серверы, похоже, поддерживают его.

1

В случае, если клиент завершает работу без возможности оповещения сервера, основные характеристики реализации TCP определяют поведение.

Пока ваше приложение (и сама хост-система) не пытается отправить какие-либо данные по этому сломанному соединению, хост не поймет, что что-то не так. Следовательно, соединение может оставаться «открытым» в течение длительного времени и выделять ресурсы с точки зрения сервера.

Однако в момент, когда данные пытались отправить на удаленный конец, удаленный конец не подтвердит извлечение, и повторная передача TCP вступает в игру. Он включает определенное количество повторений и использует таймауты. Точные параметры зависят от реализации (используемая операционная система). Когда окончательная ретрансляция завершается с ошибкой, соединение TCP закрывается и ресурсы освобождаются на стороне сервера. Таким образом, вы можете

  • полагаться на то, что в каком-то момент ваше приложение может понадобиться написать отсутствующий удаленный конец и при этом вызвать обнаружение мертвой связи или
  • обнаруживать отсутствие удаленных концов себя используя что-то вроде pings на уровне приложения или
  • используйте что-то вроде pings на уровне операционной системы, используя методы keepalive TCP.
0

Если пользователь закрывает вкладку браузера с открытым веб-сокетом, сервер не будет знать, что он был закрыт сразу. Однако, как говорит Ян-Филип, если вы попытаетесь написать операцию, произойдет сбой и с использованием ошибки, если вы знаете текущее состояние соединения.

Например, при использовании ws lib для nodejs, если вы попытаетесь отправить данные в закрытый websocket, будет выведено исключение, сказав что-то вроде [Ошибка: не открыта]. Они знают, что связь больше не существует, и вы можете сделать любую необходимую очистку.

Смежные вопросы