【发布时间】:2021-11-19 05:19:39
【问题描述】:
我正在尝试构建一个颤振应用程序以通过我的本地网络将文件发送到任何设备。我正在使用套接字发送和接收数据。传输成功,但整个过程非常耗费资源(RAM)(我相信是因为 Uint8List 和在服务器端和客户端创建的构建器。)
因此,我只能发送大小为 100-200 MB 的文件而不会耗尽内存。 我想知道是否可以通过优化代码或任何其他文件传输方法来更有效地发送数据。
服务器端代码:
import 'dart:io';
import 'dart:typed_data';
void main() async {
final server = await ServerSocket.bind('localhost', 2714);
server.listen((client) {
handleClient(client);
});
}
void handleClient(Socket client) async {
File file = File('1.zip');
Uint8List bytes = await file.readAsBytesSync();
print("Connection from:"
"${client.remoteAddress.address}:${client.remotePort}");
client.listen((Uint8List data) async {
await Future.delayed(Duration(seconds: 1));
final request = String.fromCharCodes(data);
if (request == 'Send Data') {
client.add(bytes);
}
client.close();
});
}
客户端代码:
import 'dart:io';
import 'dart:typed_data';
int size = 0;
void main() async {
final socket = await Socket.connect('localhost', 2714);
print("Connected to:" '${socket.remoteAddress.address}:${socket.remotePort}');
socket.write('Send Data');
await socket.listen((Uint8List data) async {
await Future.delayed(Duration(seconds: 1));
dataHandler(data);
size = size + data.lengthInBytes;
print(size);
print("ok: data written");
});
await Future.delayed(Duration(seconds: 20));
socket.close();
socket.destroy();
}
BytesBuilder builder = new BytesBuilder(copy: false);
void dataHandler(Uint8List data) {
builder.add(data);
if (builder.length <= 1049497288) {
// file size
Uint8List dt = builder.toBytes();
writeToFile(
dt.buffer.asUint8List(0, dt.buffer.lengthInBytes), '1(recieved).zip');
}
}
Future<void> writeToFile(Uint8List data, String path) {
// final buffer = data.buffer;
return new File(path).writeAsBytes(data);
}
我对 Dart 和 Flutter 还是很陌生,任何帮助将不胜感激,谢谢。
【问题讨论】:
-
await File('1.zip').openRead().pipe(socket); print('file copied'); -
非常感谢@pskink,Diego 的解决方案完全解决了这个问题。