У меня проблемы с подключением к моему серверу, на котором запущен flask -socketio с использованием библиотеки socket.io-client.
Соединение с длинным опросом работает правильно, но не может перейти на веб-сокеты. По этой причине я отключил опрос в качестве транспортного протокола и оставил только ['websocket']
.
В моем сценарии я сначала выполняю вызов HTTPS на конечную точку, отличную от ws, которая правильно обрабатывается flask server.
Затем я пытаюсь подключиться к websocket с помощью socket.io-client.
Сетевой журнал в средствах отладки показывает, что был запрос к wss://mysite.com/socket.io/?EIO=3&transport=websocket
со статусом 101 код, но время ожидания соединения истекает через 20 секунд (получено событие connect_timeout
).
Однако, когда я скопировал запрос из сетевого журнала «как cURL» и передал его параметры * в wscat , соединение было успешно установлено через долю секунды, и я получил данные, отправленные клиенту.
* Мне пришлось немного изменить эти параметры:
- Удалить параметр
--compressed
, не поддерживаемый инструментом. - Мне пришлось удалить заголовок
Sec-WebSocket-Key
, так как я сообщил об ошибке Invalid Sec-WebSocket-Accept header
. Возможно, это из-за ошибки wscat
, я проверил хэши из заголовков ответов вручную (хотя я использовал те, которые были видны в браузере), и они были правильными, более того, ни Firefox, ни Chrome сообщил об аналогичных проблемах. - Мне пришлось удалить заголовок
Origin
, потому что по неизвестной причине соединение было немедленно прервано с ошибкой 1005.
Я выполняю предварительное формирование обоих этих соединений на той же машине. Когда я запускал сервер flask (поверх gevent-websocket
) локально, проблем с установкой соединения с веб-сокетом не было.
Проблемы возникают тогда, когда сервер работает в AWS облаке . Я установил Application Load Balancer, который перенаправляет трафик HTTPS c в экземпляр EC2, где nginx перенаправляет трафик c на сервер flask -socketio, работающий поверх gevent-websocket
.
HTTPS-запросы маршрутизируются правильно из браузера и из командной строки, но wss-соединение не может быть установлено из браузера (ни Firefox, ни Chrome), только из командной строки.
Потратив несколько часов на отладку этой проблемы Я пришел сюда, чтобы узнать возможные причины и решения этой проблемы.
Я попытался исключить nginx из уравнения, перенаправляющего трафик c напрямую из балансировщика нагрузки на порт сервера, но это не помогло.
wss://mysite.com/socket.io/?EIO=3&transport=websocket
запрос, сделанный браузером, появляется в журнале nginx, но сервер flask не получает событие 'connect', как и ' сторона socket.io-client.