Выяснение причины закрытия веб-узлов с закрытым кодом 1006

Я хотел бы получить причины, по которым закрыты websockets, поэтому я могу показать правильное сообщение пользователю.

У меня

sok.onerror=function (evt) 
     {//since there is an error, sockets will close so...
       sok.onclose=function(e){
           console.log("WebSocket Error: " , e);}

Код всегда 1006, и причина всегда "". Но я хочу разделить разные причины закрытия.

Например, строка comand дает ошибку: "вы не можете удалить это, потому что база данных не позволит вам". Но на консоли Chrome причина по-прежнему "".

Любой другой способ разделить разные причины закрытия?

Ответ 1

Закрыть код 1006 - это специальный код, который означает, что соединение было анонимно (локально) закрыто реализацией браузера.

Если ваш клиент-клиент браузера закрывает код 1006, вам следует посмотреть событие websocket.onerror(evt) для получения более подробной информации.

Тем не менее, Chrome редко сообщают обо всех закрытых кодах 1006 аргументов стороне javascript. Вероятно, это связано с правилами безопасности клиента в спецификации WebSocket, чтобы предотвратить злоупотребление websocket. (например, использовать его для сканирования открытых портов на целевом сервере или для создания множества подключений для атаки "отказ в обслуживании" ).

Обратите внимание, что Chrome будет часто сообщать о закрытом коде 1006, если во время HTTP-обновления до Websocket есть ошибка (это шаг до того, как веб-сайт технически "подключен" ). По причинам, таким как плохая аутентификация или авторизация или использование плохого протокола (например, запрос подпротокола, но сам сервер не поддерживает этот же подпротокол) или даже попытка поговорить с местоположением сервера, которое не является веб-узлом (например, например, попытка подключения к ws://images.google.com/)

В принципе, если вы видите закрытый код 1006, у вас очень низкая ошибка уровня с самим websocket (аналогично "Unable to Open File" или "Socket Error" ), не предназначенная для пользователя, так как это указывает на проблему низкого уровня с вашим кодом и реализацией. Исправьте проблемы с низким уровнем, а затем, когда вы подключены, вы можете включить более разумные коды ошибок. Вы можете выполнить это с точки зрения объема или серьезности вашего проекта. Пример: информация и уровень предупреждения являются составной частью вашего конкретного проекта и не приводят к завершению соединения. С серьезными или фатальными сообщениями, сообщающими также с использованием вашего протокола проекта, чтобы передать как можно больше деталей, а затем закрыть соединение, используя ограниченные возможности тесного потока websocket.

Помните, что коды закрытия WebSocket очень строго определены, а фраза/сообщение с закрытой причиной не может превышать 123 символа (это преднамеренное ограничение на веб-расписание).

Но не все потеряно, если вы просто хотите эту информацию для отладки, подробно о закрытии и о своей основной причине часто сообщается с большим количеством подробностей в консоли javascript Chrome.

Ответ 2

Похоже, что это тот случай, когда Chrome не соответствует стандарту WebSocket. Когда сервер инициирует закрытие и отправляет закрытый кадр клиенту, Chrome считает, что это ошибка, и сообщает об этом стороне JS с кодом 1006 и сообщением о причине нет. В моих тестах Chrome никогда не реагировал на инициированные сервером закрытые кадры (код закрытия 1000), предполагая, что код 1006, вероятно, означает, что Chrome сообщает о своей собственной внутренней ошибке.

PS Firefox v57.00 правильно обрабатывает этот случай и успешно доставляет сообщение о причине сервера на сторону JS.

Ответ 3

В моем и, возможно, в случае @BIOHAZARD это был nginx proxy timeout. По умолчанию это 60 sec без активности в сокете

Я изменил его на 24 часа в nginx, и это решило проблему

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;

Ответ 4

У меня ошибка при использовании Chrome в качестве клиента и golang gorilla websocket в качестве сервера под прокси-сервером nginx

И отправка только некоторого сообщения "ping" с сервера на клиент каждую x секунду решенную проблему

Ответ 5

Убедитесь, что ваш отладчик отключен.

Ответ 6

Это может быть ваш URL-адрес веб-сокета, который вы используете на устройстве, не совпадают (вы используете другой URL-адрес веб-сокета от android/iphonedevice)