Проблемы с WebSockets во Flutter

У меня возникли проблемы с реализацией WebSockets в моем приложении флаттера.

Вот мой код:

void connectToWebSocket() {
print("trying to connect to websocket");

final Future futureChannel = establishConnection();
futureChannel.then((future) {
  print("Connection established, registering interest now...");
  channel = future;
  webSocketConnected = true;
  channel.sink.add({
    "action": "saveConnection",
    "UserName": "[email protected]",
    "DeviceId": "1d0032000947363339343638"
  });
}).catchError((error) {
  channel = null;
  webSocketConnected = false;
  webSocketConnectionError = error.toString();
  print("Connection failed \n $webSocketConnectionError");
});
}

Future<IOWebSocketChannel> establishConnection() async {
final IOWebSocketChannel channel = IOWebSocketChannel.connect(
    'wss://1j839fy6t3.execute-api.us-east-1.amazonaws.com/Dev');

return channel;
}

Кажется, что ничего не происходит, когда этот код работает. Я вижу сообщения печати о попытке подключения к WebSocket и установлении соединения, регистрируя интерес сейчас... на консоли.

WebSocket реализован с использованием AWS API Gateway, и я вижу в журналах, что приложение Flutter не подключилось к WebSocket.

Я протестировал WebSocket с помощью инструмента командной строки wscat и знаю, что он работает.

Инструмент командной строки wscat

Я не вижу никакой ошибки в консоли.

Дайте мне знать, если вы хотите увидеть больше моего кода.


person DrkStr    schedule 26.09.2019    source источник
comment
Вы предоставили некоторую аутентификацию с помощью wscat?   -  person Jalil Compaoré    schedule 26.09.2019
comment
Неа. Пробуем WebSockets в первый раз, поэтому пока реализуем их просто. Я добавил скриншот теста wscat.   -  person DrkStr    schedule 27.09.2019
comment
эй, @DrkStr, тебе удалось подключиться к веб-сокетам AWS?   -  person zwitterion    schedule 12.11.2019
comment
эй @DrkStr хорошо! Я изо всех сил пытаюсь понять, как связать aws-iot с флаттером, не могли бы вы мне помочь? Здесь у вас есть мой адрес электронной почты [email protected]   -  person zwitterion    schedule 13.11.2019
comment
У меня нет опыта работы с AWS IoT. Я просто использовал WebSockets в шлюзе API. Рад помочь вам в этом. :)   -  person DrkStr    schedule 13.11.2019
comment
@DrkStr, не могли бы вы поделиться фрагментом того, что именно вы изменили в коде, чтобы он работал на вас? У меня такая же проблема :(   -  person Nazehs    schedule 23.05.2020
comment
@Nazehs, эй, я отправил ответ с тем, что сработало для меня. Извините, что не выложила раньше, я была слишком взбешена всем этим в то время. Надеюсь, поможет.   -  person DrkStr    schedule 23.05.2020


Ответы (3)


Оказывается, вы channel.sink.add принимаете строку, а не карту.

Заменять

channel.sink.add({
"action": "saveConnection",
"UserName": "[email protected]",
"DeviceId": "1d0032000947363339343638"
});

С

channel.sink.add('{
"action": "saveConnection",
"UserName": "[email protected]",
"DeviceId": "1d0032000947363339343638"
}');

и это должно работать.

person DrkStr    schedule 23.05.2020

Пакет web_socket_channel содержит инструменты, необходимые для подключения к серверу WebSocket. Пакет предоставляет WebSocketChannel, который позволяет пользователям как прослушивать сообщения с сервера, так и отправлять сообщения на сервер.

Используйте следующую строку, чтобы создать WebSocketChannel, который подключается к серверу:

var channel = IOWebSocketChannel.connect("ws://localhost:1234");

Прослушивание сообщений с сервера:

StreamBuilder( 
  stream: widget.channel.stream, 
  builder: (context, snapshot) { 
    return Text(snapshot.hasData ? '${snapshot.data}' : ''); 
  }, 
); 

Отправить данные на сервер:

Чтобы отправить данные на сервер, добавьте сообщения () в приемник, предоставленный WebSocketChannel, как показано ниже:

channel.sink.add('connected!');

Закрыть соединение. Чтобы закрыть соединение с WebSocket, используйте следующую команду:

channel.sink.close();
person Paresh Mangukiya    schedule 05.12.2020

Я не понимаю, чего ты хочешь. Но если вам нужен веб-сокет, вы можете обратиться к нему ниже.

  1. Добавить дартс паб

    adhara_socket_io
    
  2. Добавить курс

    class SignalServer {
     static SignalServer _instatnce;
     factory SignalServer() => _instatnce ?? new SignalServer._();
     SignalServer._();
     SocketIO socketIO;
     int State = 0;
     void ConnectServer() async {
       this.socketIO = await SocketIOManager().createInstance("http://192.168.50.65:8081");
       socketIO.onConnect((data) {
        print("Signal server connected");
        State = 1;
       });
       socketIO.onDisconnect((_) {
        print("Signal Disconnected");
        State = 0;
       });
       socketIO.connect();
     }
    }
    
  3. Например (main.dart)

    static SignalServer signalServer;
    ....
    signalServer = new SignalServer();
    signalServer.ConnectServer();
    
  4. Для использования

В любом виджете

 void initState() {
  super.initState();
  setSocketEvent();
 }
 void setSocketEvent() async{
   await MyApp.signalServer.socketIO.on("room-ready", (data) {
     //enter your code
   });
   await MyApp.signalServer.socketIO.on("on-message", (data) {
     //enter your code
   });
   ...
 }

Я надеюсь, что это поможет вам.

person Akio Alex    schedule 01.10.2019