Подтвердить что ты не робот

Как работает Server-Sent Events?

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

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

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

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

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

ИЗМЕНИТЬ

В принципе, мне нужен способ сказать: "эй, тебе разрешено получать это уведомление? сначала покажите мне свой идентификатор/сеанс/токен! по каждому подключенному клиенту. Интересно, возможно ли это с SSE.

4b9b3361

Ответ 1

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

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

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

В принципе, мне нужен способ сказать "эй, тебе разрешено это уведомление? сначала покажите мне свой идентификатор/сеанс/токен! на подключенной клиентской базы. Интересно, возможно ли это с SSE.

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Я тестировал это с последней версией хром и firefox.

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

edit: видимо, это необязательно/бесполезно. См. Комментарий @Tamlyn.