2014-01-09 4 views
1

У меня проблема с сервером Dart. Я пытаюсь отправить нескольким клиентам некоторую информацию, но у меня нет информации, доступной для них, когда они ее запрашивают. Это означает, что я использую Future, и когда это завершается Future, я затем отправлю данные обратно клиенту.Маршрутизация Dart нескольким клиентам одновременно

Проблема заключается в том, что сервер не позволит подключиться к серверу (или более) к серверу, пока первый 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

Просто увидел это сбоку. Посмотрите на это. http://stackoverflow.com/questions/16703631/dart-handle-incoming-http-requests-in-parallel?rq=1 –

+0

Ну, это не помогло. Я все еще застрял здесь. –

ответ

4

Я вполне уверен, что он не блокирует никаких запросов. Я думаю, что это ваш клиент (браузер?), Который ставит в очередь соединения только с одним сокетом (возможно, с keep-alive). Это очень нормально для браузеров, чтобы сохранить количество сокетов в использовании, до минимума.

Сервер Dart предназначен для одновременной обработки нескольких запросов, а пакет маршрутизатора не является исключением.

+1

Да, я должен был упомянуть, что мой клиент - это браузер. Я считаю, что ты прав. Я попытался подключиться с помощью двух вкладок Chrome, и это было в порядке вещей, но с Chrome и Firefox он работает так, как я ожидал. Благодарю. –

1

Вы можете выделить один изолят для сбора данных и нескольких изолятов, каждый из которых обрабатывает запрос клиента (используя стратегии, обсуждаемые в вопросе, на который вы ссылались в своем комментарии).

Все ваши изоляторы обработки запроса могут подключаться к одному изолятору сбора данных и блокировать до тех пор, пока данные не будут доступны.
Изолятор сбора данных может кэшировать данные, чтобы обслуживать одни и те же данные для каждого последующего запроса.

Я еще не использовал изоляты, и я не знаю, может ли несколько изолятов (обработчик запросов) подключаться к одному и тому же изолятору (сборщику данных) с использованием портов, и если это работает так, как это происходит.
Если это не работает, я уверен, что несколько изолятов (обработчик запросов) могут подключаться к одному изолятору (сборщику данных) с использованием TCP.

Смежные вопросы