У меня 3000 строк и 20 столбцов данных, большинство ячеек имеет текст длиной 50 или 80 символов.Я тестирую, используя aqueduct и Dart Server, чтобы увидеть, какой из них лучше промежуточный вариант между данными сервера и обменом данными Flutter.
Я использую 2 варианта для теста.Все, что я могу проверить, это то, что for (var data в _socket) работает около 10 или 12 раз для получения целых данных.С другой стороны, _socket.liste потерял большую часть данных.
В обоих я даже использую await Future.delayed (Продолжительность (секунд: 7)) ... И результат был один и тот же.Короче говоря, они оба очень быстрые.но для больших данных у меня проблема с получением правильного результата.
Как отправить большие текстовые данные из сокета tcp в приложение Flutter?
// OPTION 1
_socket.listen((List<int> data) {
String _reply = new String.fromCharCodes(data).trim();
_reply = "$_reply$_tmpValue";
});
// OPTION 2
await for (var data in _socket) {
String _reply = new String.fromCharCodes(data).trim();
_reply = "$_reply$_tmpValue";
}
ОБНОВЛЕНИЕ:
final Socket client = await Socket.connect('192.168.22.120', 3000);
client.add(utf8.encode('$_requestedData\r\n'));
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');
РЕЗУЛЬТАТ основное сделано _reply: получено 4206144564389427761 получено 6861850004482897203 получено 2368148215793798714
ОБНОВЛЕНИЕ (рабочий раствор):
_socket = await Socket.connect('127.0.0.1’, 3000);
_socket.write(_myQuery);
await for (var data in _socket) {
_reply = new String.fromCharCodes(data);
_rawValue = _rawValue + _reply;
int dataLen;
dataLen = _reply.length;
int carriageReturnPosition;
carriageReturnPosition = dataLen - 2;
int newLinePosition;
newLinePosition = dataLen - 1;
// In my scenario it loops 32 times and it takes about 145 seconds to get big data
if (_reply.substring(carriageReturnPosition, newLinePosition) == '\r' &&
_reply.substring(newLinePosition, dataLen) == '\n') {
await _socket.close();
_returnData = _reply;
}
}