Sockets 如何在Dart中从Future返回套接字数据?
很可能我将数据发送到服务器,并使用下面的代码在=================行之间返回数据,即使是非常大的数据。这是我的实验,因为我需要一些中间解决方案,以便我可以将我的颤振应用程序连接到tcp套接字。为此,我选择auqeduct.io。今天,在Gazi的帮助下,我找到了在=================行之间完成代码的解决方案 因为我使用的是auqeduct,所以它们的句柄函数如下所示Sockets 如何在Dart中从Future返回套接字数据?,sockets,dart,return,future,Sockets,Dart,Return,Future,很可能我将数据发送到服务器,并使用下面的代码在=================行之间返回数据,即使是非常大的数据。这是我的实验,因为我需要一些中间解决方案,以便我可以将我的颤振应用程序连接到tcp套接字。为此,我选择auqeduct.io。今天,在Gazi的帮助下,我找到了在=================行之间完成代码的解决方案 因为我使用的是auqeduct,所以它们的句柄函数如下所示 @override Future<RequestOrResponse> handle(
@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)元);
打印(“未来在此结束”);
返回安全响应;
}
结果:
这可能行得通。不过,我认为您应该仔细阅读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更清晰。我确实有一个我的视频,你可以观看,可以在开始时跳过部分我在其中谈到了颤振。你也可以看另一个有点老的视频:你也可以读这些