Как использовать Dart socket onError в качестве встроенной функции? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть дартс-сокет, который получает очень длинные данные.К счастью, третья сторона добавляет конец данных \ 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);
  }
}

1 Ответ

0 голосов
/ 11 июня 2019
<!-- language: dart -->  
String _queryA = "QueryLongData";  
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( ( await _socket.done enter code here) == true) {  
    print("Exiting...");  
    exit(0);  
}
...