#flutter #sockets #dart #socket.io
#флаттер #сокеты #dart #socket.io
Вопрос:
Я использую этот пакет, и он работает должным образом на тестовых веб-сайтах, но в приложении я получил эту ошибку
WebSocketException: Connection to 'https://socket.excopro.com:0/socket.io/?EIO=3amp;transport=websocket#' was not upgraded to websocket
и это мой код
SocketService() {
var socket = io(
'https://socket.excopro.com:443/', <String, dynamic>{
'transports': ['websocket'],
'autoConnect': true,
});
socket.on('connect', (_) {
print('connect');
socket.emit('msg', 'test');
});
socket.on("connecting", (data) => print('connecting'));
socket.on('connect_error', (data) {
print(data);
socket.emit('msg', 'test');
});
}
Комментарии:
1. Я столкнулся с аналогичной проблемой. Есть решение?
2. Можно ли как-то распечатать код ошибки?
Ответ №1:
Я столкнулся с той же проблемой.
В моем случае я использую Nginx в качестве прокси. Я решил проблему, добавив некоторый заголовок прокси в свою конфигурацию Nginx.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Вы можете обратиться к этой ссылке.
Комментарии:
1. Эй, как я могу это сделать в общей cpanel / hosting
2. Спасибо за этот ответ, у меня возникла эта проблема при запуске клиента Bluebubbles в Windows через мой собственный обратный прокси-сервер nginx, и это решило проблему для меня.
Ответ №2:
Я столкнулся с этой ошибкой в моем приложении Flutter / Dart, которое обслуживается NGinx NChan. Оказалось, что wss:...
URL-адрес, который я создавал в Dart, был искажен — это легко сделать, если вы выполняете интерполяцию строк в Dart, PHP и JS в течение нескольких минут, учитывая, что каждый язык имеет свой собственный способ интерпретации интерполированных переменных в фигурных скобках. Результатом стало то, что location = ~ /path/(regex)$
настройка в моем Nginx / NChan conf не распознала URL-адрес как тот, до которого требуется обновление wss
. Затем Nginx попытался найти ресурс https://example.com/malformed/path
без его обновления wss
, после чего в Dart появилась эта ошибка.
Урок — когда это произойдет, убедитесь, что URL-адрес, к которому вы пытаетесь подключиться, правильно сформирован, поэтому он в конечном итоге распознается как один, требующий обновления до wss
серверной части.
Ответ №3:
Вы должны обязательно включить websocket на виртуальном хосте.
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteRule /(.*) ws://127.0.0.1:3055/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://127.0.0.1:3055/$1 [P,L]
Вот полный виртуальный хост, если кому-то нужно,
<VirtualHost *:80>
ServerName domain.com
ServerAlias www.domain.com
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://127.0.0.1:3055/
ProxyPassReverse / https://127.0.0.1:3055/
ProxyPass /api http://127.0.0.1:3055/api
ProxyPassReverse /api https://127.0.0.1:3055/api
RewriteEngine on
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteRule /(.*) ws://127.0.0.1:3055/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://127.0.0.1:3055/$1 [P,L]
RewriteCond %{SERVER_NAME} =domain.com [OR]
RewriteCond %{SERVER_NAME} =www.domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Ответ №4:
Получил эту ошибку, когда произошло несоответствие клиентской и серверной версий socket_io
. Попробуйте найти версию, соответствующую версии, используемой сервером.
Ответ №5:
У меня была такая же ошибка, это то, что моя среда:
- VPS с docker
- Azuracast как контейнер
- Диспетчер прокси-серверов Nginx в качестве контейнера
- общедоступный домен, который указывает на Azuracast через hots в nginx proxy manager.
- мобильное приложение flutter / dart, передающее поток радиопотоков, и я хотел получать обновления «Сейчас воспроизводится аудио» через Websocket.
У меня была такая же ошибка при попытке подключиться через схему https с / без порта.
Я, наконец, обнаружил, что в nginx proxy manager мне нужно активировать опцию Websocket на созданном мной хосте. Затем изменил мой URL на wss://...
вместо https://...
В flutter я использовал этот пакет для websocket => web_socket_channel: ^2.2.0
и это строка кода для инициализации websocket:
var websocket = IOWebSocketChannel.connect(Uri.parse('wss://xxx.com/api/live/nowplaying/my_station_shortcode'))