【问题标题】:How to convert a Dart Html client web socket response from Blob to Uint8List?如何将 Dart Html 客户端 Web 套接字响应从 Blob 转换为 Uint8List?
【发布时间】:2015-04-30 21:52:19
【问题描述】:

我已经为从 Dart 客户端到 Java 服务器的简单请求/响应对象实现了自己的二进制消息协议。这些在 Dart 中编码为 Uint8List,在远程服务器上在 Java 中编码为 ByteBuffer。往返适用于 [dart:io] 中的 WebSocket,因为 Dart 客户端命令应用程序中的 websocket.listen 流处理程序传递的数据类型为 Uint8List。

在 [dart:html] 中,从 websocket.onMessage 流接收的 MessageEvent.data 中的响应数据类型为 Blob。我没有找到将 Blob 转换为 Uint8List 的方法。因为响应通常是一个大型二进制数字数组(double),它将向虚拟滚动上下文提供数据,所以我想尽量减少复制。有人能指出我正确的方向吗?

【问题讨论】:

    标签: dart


    【解决方案1】:

    根据article,您需要使用 FileReader 来执行此操作。

    这个例子似乎有效,当我在 Chrome 中测试时,结果类型是 Uint8List。

      var blob = new Blob(['abc']);  
      var r = new FileReader();
      r.readAsArrayBuffer(blob);
      r.onLoadEnd.listen((e) {
        var data = r.result;
        print(data.runtimeType);
      });
    

    另一个选项是将WebSocket.binaryType 设置为“arraybuffer”。然后 MessageEvent.data 将返回一个 ByteBuffer ,它可以变成一个 Uint8List。请参阅下面的示例。

    import 'dart:html';
    import 'dart:typed_data';
    
    void main() {      
    
      var ws = new WebSocket('...')..binaryType = 'arraybuffer';
    
      ws.onMessage.listen((MessageEvent e) {
        ByteBuffer buf = e.data;
        var data = buf.asUint8List();
        // ...
      });
    }
    

    【讨论】:

    • @Lowe 我想避免使用 FileReader(复制缓冲区)。我正在使用 websockets 来支持具有可视化组件的低延迟数据传输。
    • 您也可以将 WebSocket.binaryType 设置为“arraybuffer”。将更新答案。
    • @Lowe:谢谢。为了使您的答案完整,请考虑添加以下内容: _onResponse(MessageEvent e) { Uint8List data = (e.data as ByteBuffer).asUint8List(); ...
    • @DartTeam:关于 web 套接字的文档中有许多片段,但它们侧重于向服务器发送消息,并且没有讨论如何配置 websocket 实例以接收二进制数据。
    • 很高兴它起作用了 ;) 我添加了一个带有额外代码的示例。许多 dart:html 文档是自动生成的。大多数代码也是从 Blink IDL 自动生成的,因此如果缺少文档,经常检查 MDN 就足够了。事物的名称通常相同。
    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 2020-03-16
    • 2016-05-11
    • 2013-10-23
    • 2012-08-05
    • 2021-07-26
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多