Ошибка ввода-вывода Flutter Socket в WebSocketException: подключение к не было обновлено до websocket

#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'))