Как именно работают события, отправленные сервером? - PullRequest
12 голосов
/ 24 мая 2011

Я пытаюсь освоить технологию веб-push, поэтому начал осматриваться.Я в основном нашел 2 технологии, то есть Websockets и SSE.После исключения Websockets из-за отсутствия поддержки Perl я хотел попробовать более родной подход SSE.

Теперь попытка заставить работать SSE - настоящая боль в заднице.Каждая документация содержит противоречивую информацию, и, как представляется, нет единого мнения о том, как работает SSE.Некоторые говорят, что вам нужен тег <event-listen src="events.pm">, другие говорят, что вам нужен только объект EventSource JS.Даже с объектом EventSource я нашел около 4 возможных реализаций, и ни одна из них, похоже, не работает.

Вот что у меня есть.У меня есть events.pm, который использует мод-Perl.Если вы вызываете этот файл, он возвращает data: I haz a websocket.Это отправляется с типом содержимого application/x-dom-event-stream.

Файлы HTML и JS так часто переписывались с разными реализациями, что я отказался от них.Ребята, не могли бы вы дать мне рабочий пример?

Также: я не понимаю, как вы можете отправлять конкретные сообщения клиенту.Отправка предварительно определенного сообщения, кажется, хорошо.Однако, если я представляю ситуацию, когда кто-то отправляет мне сообщение, я не понимаю, как именно эта информация («для вас есть новое сообщение») передается именно тому браузеру, которому нужна эта информация.Каждый пост, который я нашел в этом, в лучшем случае расплывчатый.

РЕДАКТИРОВАТЬ

По сути, мне нужен способ сказать «эй, вам разрешено получать это уведомление?покажи мне свой идентификатор / сессию / токен! 'на основе каждого подключенного клиента.Интересно, возможно ли это вообще с SSE.

Ответы [ 3 ]

7 голосов
/ 09 января 2013

Спецификация изменилась / эволюционировала. Текущая версия использует EventSource объект. Элемент HTML пропал.

Текущий тип MIME text/event-stream. x-dom-event-stream использовался только в ранних версиях (Opera в 2006 г.).

Для идентификации / аутентификации клиентов вы можете использовать куки-файлы или подключиться к URL-адресу потока событий, который содержит какой-либо токен аутентификации (идентификатор сеанса), и тогда вы узнаете, что с этим пользователем связано определенное соединение TCP / IP. .

http://html5doctor.com/server-sent-events/

7 голосов
/ 02 сентября 2011

Я бы сказал, что отправленные сервером события довольно хорошо описаны в статье Stream Updates с отправленными сервером событиями , а именно в формате Event Stream.С Firefox 6 SSE теперь поддерживаются большинством современных браузеров (к сожалению, кроме IE).

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

Клиенты соединяются с сервером SSE потоком событий keep-alive, однонаправленным соединением, которое не закрывается до тех пор, пока браузер / вкладка не будет закрыт, пользователь не вызовет метод close или сетевое соединение потеряно.

По сути, мне нужен способ сказать «эй, вам разрешено получать это уведомление?покажи мне свой идентификатор / сессию / токен! 'на основе каждого подключенного клиента.Интересно, возможно ли это вообще с SSE.

Этот тип логики аутентификации должен был бы выполняться на стороне сервера, поэтому он зависит от языка или платформы, которую вы используете.Если в вашей среде нет библиотеки для этого, вам, вероятно, придется написать ее.

1 голос
/ 15 апреля 2014

Добавление к ответу @ porneL; Вы можете указать EventSource включить файлы cookie в запрос, который они отправляют. Просто создайте объект EventSource следующим образом:

var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:true});

Я протестировал это с последней версией Chrome и Firefox.

Источник: http://www.sitepoint.com/server-sent-events/

edit: очевидно, это не нужно / бесполезно. Смотрите @ комментарий Тамлина.

...