Flutter中的WebSocket出现问题

时间:2019-09-26 13:30:25

标签: flutter dart dart-async

在Flutter应用程序中实现WebSocket时遇到一些麻烦。

这是我的代码:

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": "rakshak@gmail.com",
    "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。

我已经使用wscat命令行工具测试了WebSocket,并且我知道它可以工作。

wscat command line tool

我在控制台中没有看到任何错误。

让我知道您是否还想查看我的代码。

3 个答案:

答案 0 :(得分:1)

结果证明您channel.sink.add接受字符串而不是Map。

替换

channel.sink.add({
"action": "saveConnection",
"UserName": "rakshak@gmail.com",
"DeviceId": "1d0032000947363339343638"
});

使用

channel.sink.add('{
"action": "saveConnection",
"UserName": "rakshak@gmail.com",
"DeviceId": "1d0032000947363339343638"
}');

,它应该可以工作。

答案 1 :(得分:0)

我不明白你想要什么。但是,如果要使用websocket,可以在下面参考。

  1. 添加Dart Pub

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

希望它能对您有所帮助。

答案 2 :(得分:0)

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提供的接收器添加add()消息,如下所示:

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

关闭连接: 要关闭与WebSocket的连接,请使用以下命令:

channel.sink.close();