我已经为从Dart客户端到Java服务器的简单请求/响应对象实现了自己的二进制消息协议。它们在Dart中编码为Uint8List,在Java中作为ByteBuffer在远程服务器上编码。往返适用于[dart:io]中的WebSocket,因为Dart客户端命令应用程序中的websocket.listen流处理程序传递的数据类型为Uint8List。
在[dart:html]中,从websocket.onMessage流接收的MessageEvent.data中的响应数据被输入为Blob。我找不到将Blob转换为Uint8List的方法。因为响应通常是一个大的二进制数组(double),它将向虚拟滚动上下文提供数据,所以我想尽量减少复制。有人可以指出我正确的方向。
答案 0 :(得分:4)
根据此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();
// ...
});
}