我已经实现了自己的二进制消息协议,用于从 Dart 客户端到 Java 服务器的简单请求/响应对象。它们在 Dart 中编码为 Uint8List,在远程服务器上以 Java 编码为 ByteBuffer。往返适用于 [dart:io] 中的 WebSocket,因为 Dart 客户端命令应用程序中的 websocket.listen 流处理程序会传递类型为 Uint8List 的数据。
在 [dart:html] 中,从 websocket.onMessage 流接收到的 MessageEvent.data 中的响应数据类型为 Blob。我没有找到将 Blob 转换为 Uint8List 的方法。因为响应通常是一个大型二进制数字数组(双精度),它将向虚拟滚动上下文提供数据,所以我想最大限度地减少复制。有人可以指出我正确的方向吗?
根据这个article https://developer.mozilla.org/en-US/docs/Web/API/Blob,您需要使用 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 https://developer.mozilla.org/en-US/docs/Web/API/WebSocket到“数组缓冲区”。然后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();
// ...
});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)