【问题标题】:How to return socket data from Future in Dart?如何从 Dart 中的 Future 返回套接字数据?
【发布时间】:2019-06-26 00:41:04
【问题描述】:

我很可能使用 ========== 行之间的代码将数据发送到服务器并获取数据,甚至是非常大的数据。这是我的实验,因为我需要一些中间解决方案,这样我就可以将我的 Flutter 应用程序连接到 tcp 套接字。为此,我选择 auqeduct.io。今天在 Gazi 的帮助下,我找到了在 ============ 行之间完成代码的解决方案。

由于我使用的是 auqeduct,它们的句柄函数看起来像这样。

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

所以,我尝试修改我的代码并使用 Future 将套接字数据作为字符串返回。我可以在 =========== 行之间使用下面的代码获取数据,但我无法使用 Future _handle(String _request) async 获取任何数据。

_socket.listen((data) 打印数据无法将数据赋值给字符串,所以无法返回字符串。

有效: print("(1) $_secureResponse");

无效: _secureResponse = new String.fromCharCodes(data).trim();

如果我不使用 Future 并将代码放在 main() 中,一切都可以正常工作。

在我的测试服务器中,我发送一个“Hello World”,作为回报,我得到“Welcome Sir/Madam”。

我的问题是:如何在 Dart 中从 Future 返回套接字数据?

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. --- 预期返回“欢迎先生/女士
  5. 未来到此结束
  6. Print_test:null --- 预期返回“欢迎先生/女士
  7. Socket 开始监听数据库
  8. (1) “欢迎先生/女士

【问题讨论】:

  • 嗨尼克,我很难理解你的意思。也许如果您还可以提供一个替代结果来说明您的预期,那可能会有所帮助。
  • 它必须在我的服务器中返回正常,但 print("(6) $_secureResponse") 为空。也打印测试为空
  • 你知道有没有免费的生态测试网站,所以我可以使用ip和端口,所以我可以更新我的代码给你测试它
  • 我更新了下面的结果,你可以看到 4 stage 和 6 stage prints null
  • 对不起,我没有时间测试,我想如果你编辑你的问题以提供完整的预期输出,它会更清楚。

标签: sockets dart return future


【解决方案1】:

这可能有效。不过,我认为您应该阅读有关流/期货/异步/等待的信息。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多