Search code examples
socketstcpdartonerror

How to use Dart socket onError as inline function?


I have dart socket that gets very long data. Lucky the third party add '\r\n' end of the data, so I can close when I find last data has '\r\n'.

In weeks I am trying to get long data due server problem. Before I used to waiting endlessly to server closes the connection (sometime took me 10 to 12 min)

Now seems everything works but a small problem. I used to get onError and onDone using void function. But I am using aqueduct so I need to return long data after I receive from server as a response.

In my below full code its keep printing "Server_Error". If I comment below data seems everything works. But my problem is that I need to return error data as well.

onError: () {
      print("Server_Error");
      },
        onDone: () {
      _socket.destroy();
      },
        cancelOnError: true);

If I comment above part I can print the long data. My question is that, based on my scenario how to use Dart socket onError as inline function?

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);
  }
}

Solution

  • <!-- 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);  
    }