【问题标题】:Flutter websocket onOpen?Flutter websocket onOpen?
【发布时间】:2021-02-17 15:21:55
【问题描述】:

我正在尝试在 Flutter 中创建一个 websocket 连接。 我跟着this教程和this

我的问题是,一旦建立了 websocket 连接,我们怎么知道?就像 Javascript 中有 onOpen 事件。

我在flutter中的代码是:

void main() async {
  final channel = IOWebSocketChannel.connect('wss://my.server.org');

  channel.stream.listen(
    (dynamic message) {
      debugPrint('message $message');
    },
    onDone: () {
      debugPrint('ws channel closed');
    },
    onError: (error) {
      debugPrint('ws error $error');
    },
  );
}

【问题讨论】:

    标签: flutter dart websocket flutter-dependencies


    【解决方案1】:

    这是我在一个项目中用来连接 AWS AppSync 服务的方法。通信是通过 websockets 实现的。

    您所做的是解析您通过网络套接字接收到的消息。消息会携带数据,也有消息告诉你连接已建立,保持活动消息等。

    我不记得下面的消息是否是 AppSync 特定的,或者适用于任何 websocket 服务器 - 但它至少应该让您了解它是如何工作的。

    var channel=IOWebSocketChannel.connect(url, protocols: ['graphql-ws']);
    
    channel.sink.add(json.encode({"type": "connection_init"}));
    
    channel.stream.listen((event) {
          var e = json.decode(event);
    
          switch (e['type']) {
            case 'connection_ack':
              wsTimeoutInterval = e['payload']['connectionTimeoutMs'];
    
              var register = {
                'id': uniqueKey,
                'payload': {
                  'data': json.encode(query),
                  'extensions': {'authorization': header}
                },
                'type': 'start'
              };
              var payload = json.encode(register);
              channel.sink.add(payload);
              break;
            case 'data':
               // calling a callback function Function(Map<String, dynamic>) listener
              listener(e);
              break;
            case 'ka':
              print('Keep alive message received!!!');
              break;
            case 'start_ack':
              print('Ws Channel: Subscription started');
              break;
            default:
              print('Unimplemented event received $event');
          }
        }, onError: (error, StackTrace stackTrace) {
          // error handling
          print('Ws Channel: $error');
        }, onDone: () {
          // communication has been closed
          channel.sink.close();
          print('Ws Channel: Done!');
        });
    

    【讨论】:

    • {"type":"connection_error","payload":{"message":"Cannot read properties of undefined (reading 'Authorization')"}} 即使标题中有“授权”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多