【问题标题】:Dart Routing to Multiple Clients ConcurrentlyDart 同时路由到多个客户端
【发布时间】:2014-01-09 01:15:50
【问题描述】:

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

有没有办法做到这一点?

谢谢。

【问题讨论】:

标签: stream dart server-side routes


【解决方案1】:

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

Dart 服务器被设计成同时处理多个请求,路由器包也不例外。

【讨论】:

  • 是的,我应该提到我的客户端是一个浏览器。我相信你是对的。我尝试使用两个 Chrome 选项卡进行连接,它正在排队,但使用 Chrome 和 Firefox,它可以按我的预期工作。谢谢。
【解决方案2】:

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

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

我还没有大量使用隔离,我不知道多个隔离(请求处理程序)是否可以使用端口连接到同一个隔离(数据收集器),以及这是否有效。
如果这不起作用,我确信多个隔离(请求处理程序)可以使用 TCP 连接到一个隔离(数据收集器)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2014-07-21
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多