Sockets 如何在Dart中从Future返回套接字数据?

Sockets 如何在Dart中从Future返回套接字数据?,sockets,dart,return,future,Sockets,Dart,Return,Future,很可能我将数据发送到服务器,并使用下面的代码在=================行之间返回数据,即使是非常大的数据。这是我的实验,因为我需要一些中间解决方案,以便我可以将我的颤振应用程序连接到tcp套接字。为此,我选择auqeduct.io。今天,在Gazi的帮助下,我找到了在=================行之间完成代码的解决方案 因为我使用的是auqeduct,所以它们的句柄函数如下所示 @override Future<RequestOrResponse> handle(

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

因为我使用的是auqeduct,所以它们的句柄函数如下所示

@override
  Future<RequestOrResponse> handle(Request request) async {
@覆盖
未来句柄(请求)异步{
因此,我尝试修改我的代码并使用Future以字符串形式返回套接字数据。我可以使用下面的代码在==============行之间获取数据,但使用Future句柄(字符串请求)异步无法获取任何数据

_listen((数据)打印数据无法将数据分配给字符串,因此无法返回字符串

工作:打印((1)$\u安全响应)

未工作:\u 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;
}
导入'dart:async';
导入“dart:io”;
导入“dart:convert”;
插座;
字符串错误数据;
字符串_secureResponse;
void main()异步{
var_test=等待句柄(“Hello World”);
打印(“打印测试:$打印测试”);
}
未来句柄(字符串请求)异步{
打印(“未来从这里开始”);
打印(“请求:$\请求”);
_errorData=“服务器错误”;
如果(_请求!=null){
打印(“请求有数据”);
// =============================================================
插座(u插座),;
等待套接字。连接(“192.168.22.120”,3000)。然后((套接字套接字){
_插座=插座;
_socket.listen((数据){
打印(“套接字开始侦听数据库”);
//从服务器获取*********************
_secureResponse=新字符串.fromCharCodes(data).trim();
打印((1)元);
},onError:((错误,堆栈跟踪){
_secureResponse=\u errorData;
打印((2)元);
}),onDone:(){
_socket.destroy();
出口(0);
}),cancelOnError:false);
}).然后(){
打印(“套接字将数据发送到数据库”);
//发送到服务器************************
_socket.write('$\u请求\r\n');
}).catchError((异步错误e){
_secureResponse=\u errorData;
打印((3)元);
出口(1);
});
// ==============================================================
}否则{
_secureResponse=\u errorData;
打印((4)元);
}
打印((6)元);
打印(“未来在此结束”);
返回安全响应;
}
结果:

  • 未来从这里开始
  • 请求:“你好,世界
  • 请求有数据套接字将数据发送到数据库
  • (6) 空。--应为返回“欢迎先生/女士”
  • 未来到此结束
  • 打印测试:null--预期值返回“欢迎先生/女士”
  • 套接字开始侦听数据库
  • (1) “欢迎您,先生/女士”

  • 这可能行得通。不过,我认为您应该仔细阅读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;
    } 
    
    Future\u句柄(字符串请求)异步{
    打印(“未来从这里开始”);
    打印(“请求:$\请求”);
    _errorData=“服务器错误”;
    如果(_请求!=null){
    打印(“请求有数据”);
    // =============================================================
    插座(u插座),;
    等待套接字。连接(“192.168.22.120”,3000)。然后((套接字套接字){
    _插座=插座;
    }).然后(){
    打印(“套接字将数据发送到数据库”);
    //发送到服务器************************
    _socket.write('$\u请求\r\n');
    首先返回_插座;
    }).然后((数据){
    打印(“套接字开始侦听数据库”);
    //从服务器获取*********************
    _secureResponse=新字符串.fromCharCodes(data).trim();
    打印((1)元);
    }).catchError((异步错误e){
    _secureResponse=\u errorData;
    打印((3)元);
    出口(1);
    });
    // ==============================================================
    }否则{
    _secureResponse=\u errorData;
    打印((4)元);
    }
    打印((6)元);
    打印(“未来在此结束”);
    返回安全响应;
    } 
    
    Hi Nick,我发现很难理解你的意思。也许如果你也能提供一个替代结果,说明你的期望,这可能会有所帮助。它必须在我的服务器中返回OK,但要打印((6)$\u secureResponse)是空的。打印测试也是空的。你知道任何免费的生态测试网站吗?这样我就可以使用ip和端口,这样我就可以更新我的代码给你测试itI。更新下面的结果,因为你可以看到4阶段和6阶段打印。对不起,我没有时间测试,我想如果你编辑你的问题以提供完整的预期输出,它会更清晰。谢谢非常好。是的,它可以工作。我对streams/futures/async/await非常困惑。用清晰的例子看一个好的文档。有什么想法吗?我不知道我可以使用。然后twiceEach返回一个未来,你可以再次使用它。但是使用await更清晰。我确实有一个我的视频,你可以观看,可以在开始时跳过部分我在其中谈到了颤振。你也可以看另一个有点老的视频:你也可以读这些