Flutter 中的 WebSockets 问题

Trouble with WebSockets in Flutter

我在 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": "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 网关实现的,我在日志中看到 Flutter 应用程序未连接到 WebSocket。

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

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

如果您想查看我的更多代码,请告诉我。

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

  1. 添加飞镖酒吧

    adhara_socket_io
    
  2. 添加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. 实例(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
   });
   ...
 }

希望对你有所帮助

原来你 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"
}');

它应该可以工作。

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();