我遇到了Dart服务器的问题。我正在尝试向多个客户端发送一些信息,但是当他们提出请求时我没有可用的信息。这意味着我正在使用Future
,当Future
完成后,我会将数据发送回客户端。
问题是,当第一个Future
仍在等待完成时,服务器将不允许第二个(或更多)客户端连接到服务器。
以下是一个例子:
import "dart:async";
import "dart:io";
import "package:route/server.dart";
void main(List<String> args) {
HttpServer.bind("localhost", 5000)
.then((HttpServer server) {
Router router = new Router(server)
..serve("/multi").listen(_multi);
});
}
void _multi(HttpRequest request) {
print("Waiting");
new Timer(new Duration(seconds: 5), () {
print("Replying");
request.response.write("Hello There");
request.response.close();
});
}
基本上,如果您一次只连接一个客户端,这非常合适。但是,如果您有多个客户端,则连接的第一个客户端将阻止第二个客户端,直到第一个客户端的连接关闭为止。
我也曾尝试使用..serve("/multi").asBroadcastStream()...
,因为我认为这会允许多个订阅者,但行为相同。
有办法做到这一点吗?
感谢。
答案 0 :(得分:4)
我非常肯定它没有阻止任何请求。我认为你的客户端(浏览器?)将连接排队只使用一个套接字(可能是keep-alive)。对于浏览器来说,这是非常正常的,以便将正在使用的套接字数量保持在最低限度。
Dart服务器旨在同时处理多个请求,路由器包也不例外。
答案 1 :(得分:1)
您可以将一个隔离专用于收集数据,并使用多个隔离来处理客户端请求(使用您在评论中引用的问题中讨论的策略)。
您的所有请求处理隔离区都可以连接到一个数据收集隔离区并阻塞,直到数据可用为止 数据收集隔离可以缓存数据以为每个连续请求提供相同的数据。
我还没有使用隔离区,而且我不知道是否有几个隔离区(请求处理程序)可以使用端口连接到同一个隔离区(数据收集器),如果这样做有效。<登记/> 如果这不起作用,我确定几个隔离区(请求处理程序)可以使用TCP连接到一个隔离区(数据收集器)。