Могу ли я получить поток через HTTP с помощью JavaScript, Flash или Silverlight?

Я создаю прототип механизма уведомлений в реальном времени, используя http через порт 80. Цель проекта - позволить приложению Flash быстро реагировать на событие на удаленном сервере (в частности, входящий телефонный звонок, подключенный к телефону рядом с компьютером)..) Опрос - один из подходов, но он слишком медленный. В настоящее время я использую сокетное соединение для получения уведомлений о событиях на сервере с низкой задержкой, что хорошо работает, но не подходит для брандмауэров. Я не хочу устанавливать ничего, кроме Flash или Silverlight на клиенте. Кросс-совместимость браузеров не имеет значения - в этом приложении я могу указать, какой браузер использует клиент, но IE предпочтительнее.

Я сделал сервер HttpHandler в.NET, который никогда не закрывает соединение и отправляет "события" клиенту, записывая байты в поток ответов http (ConnectedClientContext.Response.OutputStream.Write и т. Д.), И у меня есть клиент.NET приложение, которое может читать эти сообщения в порядке.

Мой вопрос:

Могу ли я получать байты с сервера по HTTP, когда они приходят с использованием JavaScript, Flash или Silverlight? Пока что я могу только найти способ получать уведомления о "прогрессе загрузки" и не получать фактические байты до тех пор, пока ответ не будет закрыт - я хочу, чтобы они появлялись.

С уважением,

Даниил

3 ответа

Очень легко использовать идеи кометы для уведомлений. вам даже не нужно использовать специфическую для кометы структуру. просто сделайте ajax-запрос с обратным вызовом при ответе, оберните его в цикл, и у вас будет цикл обработки событий, как в приложении с графическим интерфейсом на стороне сервера не удосуживайтесь отвечать на запрос до тех пор, пока не будет ни событие, ни тайм-аут (который является просто нулевым событием).

Я не знаю насчет Flash, но в Javascript (что вы подразумеваете под браузером) и Silverlight вы в значительной степени ограничены протоколом http.

Вы можете использовать AJAX Http Streaming pattern. Основная идея, которая отличается от того, что вы пытаетесь сделать, заключается в том, что как только данные становятся доступны, невыполненный запрос заканчивается, и новый немедленно инициируется асинхронно, то есть, пока ваш клиент обрабатывает вновь поступившие данные.

Silverlight предоставляет вам больше возможностей, поскольку стек HTTP является чисто асинхронным, но вы можете получить доступ к потоку, как только данные начнут поступать, установив HttpWebRequest.AllowReadStreamBuffering в false, (В отличие от XmlHttpRequest, который всегда буферизуется).

Flex и Flash имеют несколько библиотек удаленного взаимодействия AMF/XML, которые поддерживают передачу данных. Я бы, конечно, посмотрел на это.

http://raghuonflex.wordpress.com/2008/04/17/data-push-in-flex-with-backend/

Эти библиотеки используют Comet - подобную реализацию для достижения этой цели.

Другие вопросы по тегам