У меня есть дартс-сокет, который получает очень длинные данные.К счастью, третья сторона добавляет конец данных \ r \ n, поэтому я могу закрыть, когда обнаружу, что последние данные имеют \ r \ n.
Через несколько недель я пытаюсь получить длинные данные из-за серверапроблема.Раньше я привык бесконечно ждать, чтобы сервер закрыл соединение (иногда это занимало у меня 10-12 минут)
Теперь кажется, что все работает, но небольшая проблема.Я использовал, чтобы получить onError и onDone, используя функцию void.Но я использую акведук, поэтому мне нужно возвращать длинные данные после получения от сервера в качестве ответа.
В приведенном ниже полном коде он продолжает печатать «Server_Error».Если я прокомментирую ниже данные, кажется, все работает.Но моя проблема в том, что мне также нужно возвращать данные об ошибках.
onError: () {
print("Server_Error");
},
onDone: () {
_socket.destroy();
},
cancelOnError: true);
Если я прокомментирую выше часть, я могу напечатать длинные данные.Мой вопрос заключается в том, что, основываясь на моем сценарии, как использовать Dart socket onError в качестве встроенной функции?
import 'dart:io';
import 'dart:convert';
import 'dart:typed_data';
Socket _socket;
String _reply;
String _testValue = "";
main() async {
String _queryA = “QueryLongData”;
await Socket.connect("192.168.22.120”, 3000).then((Socket sock) {
_socket = sock;
_socket.write('$_queryA\r\n');
_socket.listen((data) {
final List<int> byteArray = data;
_reply = String.fromCharCodes(byteArray);
int dataLen = _reply.length;
int carriageReturnPosition = dataLen - 2;
int newLinePosition = dataLen - 1;
_testValue = _testValue + _reply;
if (_reply.substring(carriageReturnPosition, newLinePosition) == '\r' &&
_reply.substring(newLinePosition, dataLen) == '\n') {
_socket.close();
print("Data: $_testValue"); // means return data
}
}, onError: () {
print("Server_Error");
},
onDone: () {
_socket.destroy();
},
cancelOnError: true);
}).catchError((e) {
print("Server_Error");
});
if(_socket.done == true) {
print("Exiting...");
exit(0);
}
}