Как вернуть данные сокета из Future в Dart? - PullRequest
0 голосов
/ 01 февраля 2019

Скорее всего, я отправляю данные на сервер и получаю данные даже очень больших данных, используя код ниже между =========== строками.Это было моим экспериментом, потому что мне нужно какое-то промежуточное решение, чтобы я мог подключить свое приложение Flutter к tcp-сокету.Для этого я выбираю auqeduct.io.Сегодня из справки от Gazi я нашел решение для завершения моего кода между =========== строками.

Из-за того, что я использую auqeduct, их функция дескриптора выглядит следующим образом.

@override
  Future<RequestOrResponse> handle(Request request) async {

Итак, я пытаюсь изменить свой код и использовать Future для возврата данных сокета в виде строки.Я могу получить данные, используя приведенный ниже код между строками ===========, но я не могу получить какие-либо данные с помощью асинхронного Future _handle (String _request).

_socket.listen ((data) printданные не могут присвоить данные строке, поэтому я не могу вернуть строку.

работает: print ("(1) $ _secureResponse");

не работает: _secureResponse = new String.fromCharCodes (data) .trim ();

Если я не использую Future и не помещаю код в main (), все работает отлично.

На моем тестовом сервере я отправляю «Hello World», а взамен я получаю «Welcome Sir / Madam».

Мой вопрос: Как вернуть данные сокета?из будущего в дротике?

import 'dart:async';
import 'dart:io';
import 'dart:convert';

Socket socket;
String _errorData;
String _secureResponse;

void main() async {

  var _test = await _handle(“Hello World”);
  print("Print _test: $_test");

}


Future<String> _handle(String _request) async {
  print("Future Starts Here");
  print("Request: $_request");
    _errorData = "Server_Error";
    if (_request != null) {
      print("Request has data");
      // =============================================================
      Socket _socket;
      await Socket.connect("192.168.22.120”, 3000).then((Socket sock) {
        _socket = sock;
        _socket.listen((data) {
          print("Socket start to listen to database");
          // GET FROM SERVER *********************
          _secureResponse =  new String.fromCharCodes(data).trim();
          print("(1) $_secureResponse");
        }, onError: ((error, StackTrace trace) {
          _secureResponse = _errorData;
          print("(2) $_secureResponse");
        }), onDone: ((){
          _socket.destroy();
          exit(0);
        }), cancelOnError: false);
      }).then((_) {
        print("Socket sends data to database");
        // SENT TO SERVER ************************
        _socket.write('$_request\r\n');
      }).catchError((AsyncError e) {
        _secureResponse = _errorData;
        print("(3) $_secureResponse");
        exit(1);
      });
      // ==============================================================
    } else {
      _secureResponse = _errorData;
      print("(4) $_secureResponse");
    }
  print("(6) $_secureResponse");
  print("Future Ends Here");
  return _secureResponse;
}

Результат:

  1. Будущее начинается здесь
  2. Запрос: " Hello World
  3. В запросе есть данные Socket отправляет данные в базу данных
  4. (6) null. --- ожидается return" Welcome Sir/ Мадам"
  5. Будущее заканчивается здесь
  6. Print_test: null --- ожидается return " Welcome Sir / Madam "
  7. Запуск сокета для прослушивания базы данных
  8. (1) " Добро пожаловать, сэр / мадам "

1 Ответ

0 голосов
/ 01 февраля 2019

Это может сработать.Я думаю, что вы должны прочитать о streams / futures / async / await, хотя.

Future<String> _handle(String _request) async {
  print("Future Starts Here");
  print("Request: $_request");
    _errorData = "Server_Error";
    if (_request != null) {
      print("Request has data");
      // =============================================================
      Socket _socket;
      await Socket.connect("192.168.22.120”, 3000).then((Socket sock) {
        _socket = sock;
      }).then((_) {
        print("Socket sends data to database");
        // SENT TO SERVER ************************
        _socket.write('$_request\r\n');
        return _socket.first;
      }).then((data) {
        print("Socket start to listen to database");
        // GET FROM SERVER *********************
        _secureResponse =  new String.fromCharCodes(data).trim();
        print("(1) $_secureResponse");
      }).catchError((AsyncError e) {
        _secureResponse = _errorData;
        print("(3) $_secureResponse");
        exit(1);
      });
      // ==============================================================
    } else {
      _secureResponse = _errorData;
      print("(4) $_secureResponse");
    }
  print("(6) $_secureResponse");
  print("Future Ends Here");
  return _secureResponse;
} 
...