gpt4 book ai didi

sockets - 如何从 Dart 中的 Future 返回套接字数据?

转载 作者:行者123 更新时间:2023-12-03 03:10:22 25 4
gpt4 key购买 nike

很可能我将数据发送到服务器并使用下面的代码在 =========== 行之间取回数据,甚至是非常大的数据。这是我的实验,因为我需要一些中间解决方案,以便我可以将我的 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. future 从这里开始
  2. 请求:“Hello World
  3. 请求有数据 Socket向数据库发送数据
  4. (6) null. --- 预期返回“欢迎先生/女士
  5. future 在这里结束
  6. Print_test:null --- 预期返回“欢迎先生/女士
  7. Socket开始监听数据库
  8. (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;
}

关于sockets - 如何从 Dart 中的 Future 返回套接字数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54479462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com