这对我有用,我不确定这是最优雅的解决方案
import 'dart:io';
import 'dart:async';
import 'dart:typed_data';
main() async {
final server = await ServerSocket.bind('127.0.0.1', 4041);
server.listen((Socket socket) {
print('Got connected ${socket.remoteAddress}');
var toByte = new StreamTransformer<List<int>, Uint8List>.fromHandlers(
handleData: (data, sink) {
sink.add(new Uint64List.fromList(data).buffer.asUint8List());
});
var streamController = new StreamController<List<int>>();
streamController.stream.transform(toByte).pipe(socket);
for (int i = 0; i < 1024; i++) {
streamController.add([i]);
}
streamController.close();
print('Closed ${socket.remoteAddress}');
});
}
import 'dart:io';
import 'dart:async';
main() async {
final Socket client = await Socket.connect('127.0.0.1', 4041);
var fromByte = new StreamTransformer<List<int>, List<int>>.fromHandlers(
handleData: (data, sink) {
sink.add(data.buffer.asInt64List());
});
client.transform(fromByte).listen((e) => e.forEach(print));
print('main done');
}
最初的尝试:
import 'dart:io';
import 'dart:typed_data';
main() async {
final server = await ServerSocket.bind('127.0.0.1', 4041);
server.listen((Socket socket) {
print('Got connected ${socket.remoteAddress}');
for(int i=0; i<1024; i++) {
socket.add(new Uint64List.fromList([i]).buffer.asUint8List());
}
socket.close();
print('Closed ${socket.remoteAddress}');
});
}
import 'dart:io';
import 'dart:typed_data';
main() async {
final Socket client = await Socket.connect('127.0.0.1', 4041);
client.listen(
(var data) {
var ints = new Uint8List.fromList(data).buffer.asInt64List();
ints.forEach((i) => print('Got $i'));
},
onDone: () { print('Done'); client.close(); },
onError: (e) { print('Got error $e'); client.close(); });
print('main done');
}
如果您不需要 Int64 的范围,您也可以使用 Int32、Int16 或某些 UIntXX 类型或任何最适合您的值范围的类型,以节省一些冗余传输的 0 字节。
我怀疑使用这里解释的转换器https://www.dartlang.org/articles/converters-and-codecs/ 可以用来更优雅地完成它。这似乎与https://gist.github.com/xxgreg/9104926 相似,但我不得不承认我无法将这些示例应用于您的用例。
更新
我让它像上面链接的文章中显示的那样工作
import 'dart:convert';
import 'dart:typed_data';
class IntConverter extends Converter<List<int>, List<int>> {
const IntConverter();
List<int> convert(List<int> data) {
if (data is Uint8List) {
return data.buffer.asInt64List();
} else {
return new Uint64List.fromList(data).buffer.asUint8List();
}
}
IntSink startChunkedConversion(sink) {
return new IntSink(sink);
}
}
class IntSink extends ChunkedConversionSink<List<int>> {
final _converter;
// fales when this type is used
// final ChunkedConversionSink<List<int>> _outSink;
final _outSink;
IntSink(this._outSink) : _converter = new IntConverter();
void add(List<int> data) {
_outSink.add(_converter.convert(data));
}
void close() {
_outSink.close();
}
}
import 'dart:io';
import 'dart:typed_data';
main() async {
final server = await ServerSocket.bind('127.0.0.1', 4041);
server.listen((Socket socket) {
print('Got connected ${socket.remoteAddress}');
for (int i = 0; i < 1024; i++) {
socket.add(new Uint64List.fromList([i]).buffer.asUint8List());
}
socket.close();
print('Closed ${socket.remoteAddress}');
});
}
import 'dart:io';
import 'byte_converter.dart';
main() async {
final Socket client = await Socket.connect('127.0.0.1', 4041);
client.transform(new IntConverter()).listen((e) => e.forEach(print));
print('main done');
}