同时使用Dart路由到多个客户端

时间:2014-01-09 01:15:50

标签: stream dart server-side routes

我遇到了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()...,因为我认为这会允许多个订阅者,但行为相同。

有办法做到这一点吗?

感谢。

2 个答案:

答案 0 :(得分:4)

我非常肯定它没有阻止任何请求。我认为你的客户端(浏览器?)将连接排队只使用一个套接字(可能是keep-alive)。对于浏览器来说,这是非常正常的,以便将正在使用的套接字数量保持在最低限度。

Dart服务器旨在同时处理多个请求,路由器包也不例外。

答案 1 :(得分:1)

您可以将一个隔离专用于收集数据,并使用多个隔离来处理客户端请求(使用您在评论中引用的问题中讨论的策略)。

您的所有请求处理隔离区都可以连接到一个数据收集隔离区并阻塞,直到数据可用为止 数据收集隔离可以缓存数据以为每个连续请求提供相同的数据。

我还没有使用隔离区,而且我不知道是否有几个隔离区(请求处理程序)可以使用端口连接到同一个隔离区(数据收集器),如果这样做有效。<登记/> 如果这不起作用,我确定几个隔离区(请求处理程序)可以使用TCP连接到一个隔离区(数据收集器)。