Я реализовал WebSocket с JavaScript, и у меня есть одна проблема:
Конечная точка, к которой подключено мое веб-приложение, не отправляет обратно контрольный кадр, когда я его отправляю.
Это не так уж и плохо, потому что браузеры через некоторое время закрывают соединение WebSocket.
Но несколько вещей, на которые стоит обратить внимание:
-
Браузеры позволяют одновременно подключать только определенное количество веб-сокетов.
-
При обновлении веб-приложения создается новый WebSocket
Это вызывает проблему в IE:
При обновлении веб-приложения более 6 раз невозможно установить соединение с WebSocket.
Похоже, что IE не "удаляет" WebSockets, если они не были закрыты чисто. И что странно, что количество веб-сокетов никогда не уменьшается при обновлении или просто при ожидании.
Только закрыв окно браузера или вкладку сбрасывает количество WebSockets до 0.
Я провел некоторые исследования, и вот что я узнал:
Браузеры поддерживают только определенное количество подключаемых веб-сокетов одновременно.
IE поддерживает 6 веб-сокетов для подключения [ссылка]
Chrome поддерживает 255 подключаемых веб-сокетов [ссылка].
И socket.onclose()
не запускается, когда вы выполняете socket.close()
, он вызывается, когда конечная точка отвечает сообщением о закрытии. [ссылка на сайт]
IE ждет 15 секунд, пока конечная точка не отправит сообщение о закрытии [ссылка].
Chrome ждет ответного сообщения в течение 60 секунд [Извините, нет ссылки для этого, выяснил это путем тестирования].
Если ответное сообщение не получено, браузер закрывает соединение WebSocket и должно произойти TimeoutError.
Пожалуйста, поправьте меня, если я ошибаюсь :)
Я попытался использовать unbeforeload
для отключения от конечной точки в надежде, что браузер закроет соединение через некоторое время, но безуспешно. [ссылка].
Это также может быть причиной того, что IE не может выполнить запрос внутри функции unbeforeload
[ссылка].
Вопрос:
- Есть ли способ сбросить количество WebSockets, которые подключены в браузере к конечной точке с помощью JavaScript?
- Есть ли способ немедленно отключить WebSocket от конечной точки, не закрывая соединение чисто?
- Является ли единственный способ заставить это работать, чтобы сообщить тем, кто размещает их конечную точку, внести некоторые изменения, чтобы они отправили закрывающий кадр обратно?
- Есть ли что-то, что я неправильно понял или что я мог бы попытаться заставить это работать?
Вот (на мой взгляд) хорошая документация о протоколах WebSocket, если кто-то хотел бы узнать больше об этом [link1] [link2].
ОБНОВИТЬ:
Только обновляя веб-приложение в IE, WebSockets не разрушаются.
Если вы перемещаетесь между страницами в веб-приложении, будет создан новый WebSocket, но последний WebSocket будет уничтожен.