DrkStr
DrkStr

Reputation: 1932

Trouble with WebSockets in Flutter

I am having some trouble implementing WebSockets in my flutter application.

Here is code my code:

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;
}

Nothing seems to happen when this code runs. I can see the print messages saying "trying to connect to WebSocket" and "Connection established, registering interest now..." on the console.

The WebSocket is implemented using AWS API Gateway and I can see in the logs that the Flutter app has not connected to the WebSocket.

I have tested the WebSocket using wscat command-line tool and I know that it works.

wscat command line tool

I am not seeing any error in the console.

Let me know if you would like to see any more of my code.

Upvotes: 4

Views: 5469

Answers (2)

DrkStr
DrkStr

Reputation: 1932

Turns out you channel.sink.add accepts a string and not a Map.

Replace

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

With

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

and it should work.

Upvotes: 4

Akio Alex
Akio Alex

Reputation: 316

I don't understand what you want. But If you want websocket, you can refer below one.

  1. Add Dart Pub

    adhara_socket_io
    
  2. Add class

    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. For Instance(main.dart)

    static SignalServer signalServer;
    ....
    signalServer = new SignalServer();
    signalServer.ConnectServer();
    
  4. For use

In any widget

 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
   });
   ...
 }

I hope it will help you.

Upvotes: 0

Related Questions