Могу ли я получить поток через 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 - подобную реализацию для достижения этой цели.