首页 > 解决方案 > 如何将大文本数据从 tcp 套接字发送到 Flutter 应用程序?

问题描述

我有 3000 行和 20 列数据,大多数单元格有 50 或 80 个字符长的文本。我使用 aqueduct 和 Dart Server 进行测试,看看哪个是服务器数据和 Flutter 通信之间更好的中间选项。

我使用 2 选项进行测试。我只能测试 for (var data in _socket) 运行大约 10 或 12 次以接收整个数据。另一方面 _socket.liste 丢失了大部分数据。

在两者中,我什至都使用 await Future.delayed(Duration(seconds: 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;
  }
}

标签: socketsdartflutterbigdata

解决方案


推荐阅读