From 4504c196f6dbed5ab67233274d2fc77749c08f8d Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Wed, 19 Oct 2022 00:56:39 +0800 Subject: [PATCH] Improvements - add await in file receiving --- Dockerfile | 23 +++++++++++++++ lib/tcpcontroller/controller.dart | 47 ++++++++++++++++++++----------- 2 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c8c796f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# Specify the Dart SDK base image version using dart: (ex: dart:2.12) +FROM dart:stable AS build + +# Resolve app dependencies. +WORKDIR /app +COPY pubspec.* ./ +RUN dart pub get + +# Copy app source code and AOT compile it. +COPY . . +# Ensure packages are still up-to-date if anything has changed +RUN dart pub get --offline +RUN dart compile exe bin/server.dart -o bin/server + +# Build minimal serving image from AOT-compiled `/server` and required system +# libraries and configuration files stored in `/runtime/` from the build stage. +FROM scratch +COPY --from=build /runtime/ / +COPY --from=build /app/bin/server /app/bin/ + +# Start server. +EXPOSE 20706 +CMD ["/app/bin/server"] \ No newline at end of file diff --git a/lib/tcpcontroller/controller.dart b/lib/tcpcontroller/controller.dart index 9a09531..34a198e 100644 --- a/lib/tcpcontroller/controller.dart +++ b/lib/tcpcontroller/controller.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-08 15:10:04 - * @LastEditTime : 2022-10-18 14:50:17 + * @LastEditTime : 2022-10-19 00:54:03 * @Description : */ @@ -57,19 +57,32 @@ class TCPController { print('[L] Connection Established'); print('[L] Remote: ${socket.remoteAddress}:${socket.remotePort}'); print('[L] Local: ${socket.address}:${socket.port}'); - socket.listen( - _pullRequest, - onError: (e) { - print(e); - _requestStreamController.addError(e); - }, - onDone: () { - print('[L] [CLOSED ]-----------------------'); - print('[L] Connection closed: ${socket.address}:${socket.port}<-${socket.remoteAddress}:${socket.remotePort}'); - _requestStreamController.close(); - }, - cancelOnError: true, - ); + Future(() async { + await for(var request in socket) { + _pullRequest(request); + await Future.delayed(const Duration(microseconds: 0)); + } + }).then((_) { + print('[L] [CLOSED ]-----------------------'); + print('[L] Connection closed: ${socket.address}:${socket.port}<-${socket.remoteAddress}:${socket.remotePort}'); + _requestStreamController.close(); + }).onError((error, stackTrace) { + print(error); + _requestStreamController.addError(error ?? Error()); + },); + // socket.listen( + // _pullRequest, + // onError: (e) { + // print(e); + // _requestStreamController.addError(e); + // }, + // onDone: () { + // print('[L] [CLOSED ]-----------------------'); + // print('[L] Connection closed: ${socket.address}:${socket.port}<-${socket.remoteAddress}:${socket.remotePort}'); + // _requestStreamController.close(); + // }, + // cancelOnError: true, + // ); //This future never ends, would that be bothersome? Future(() async { try{ @@ -124,7 +137,7 @@ class TCPController { _fileCounter %= 1000; Future(() async { await for(var data in payloadPullStream) { - await tempFile.writeAsBytes(data, mode: FileMode.append, flush: true); + await tempFile.writeAsBytes(data, mode: FileMode.writeOnlyAppend); } _payloadRawStreamController.add(tempFile); }); @@ -160,7 +173,7 @@ class TCPController { if(buffer.length >= payloadLength) { //Last few bytes to emit //Send the last few bytes to stream - _payloadPullStreamController.add(Uint8List.fromList(buffer.sublist(0, payloadLength))); + _payloadPullStreamController.add(buffer.sublist(0, payloadLength)); //Clear buffer buffer.removeRange(0, payloadLength); //Set payload length to zero @@ -171,7 +184,7 @@ class TCPController { else { //Part of payload //Transmit all to stream - _payloadPullStreamController.add(Uint8List.fromList(buffer)); + _payloadPullStreamController.add(buffer); //Reduce payload bytes left payloadLength -= buffer.length; //Clear buffer