WebSockets не закрывается на IE, если закрытие рукопожатия никогда не выполняется - программирование
Подтвердить что ты не робот

WebSockets не закрывается на IE, если закрытие рукопожатия никогда не выполняется

Я реализовал 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 [ссылка].

Вопрос:

  1. Есть ли способ сбросить количество WebSockets, которые подключены в браузере к конечной точке с помощью JavaScript?
  2. Есть ли способ немедленно отключить WebSocket от конечной точки, не закрывая соединение чисто?
  3. Является ли единственный способ заставить это работать, чтобы сообщить тем, кто размещает их конечную точку, внести некоторые изменения, чтобы они отправили закрывающий кадр обратно?
  4. Есть ли что-то, что я неправильно понял или что я мог бы попытаться заставить это работать?

Вот (на мой взгляд) хорошая документация о протоколах WebSocket, если кто-то хотел бы узнать больше об этом [link1] [link2].

ОБНОВИТЬ:

Только обновляя веб-приложение в IE, WebSockets не разрушаются.
Если вы перемещаетесь между страницами в веб-приложении, будет создан новый WebSocket, но последний WebSocket будет уничтожен.

4b9b3361