我正在尝试进入网络推送技术,所以我开始四处寻找。我基本上找到了2种技术,即Websockets和SSE。在由于缺乏perl支持而排除Websockets之后,我想尝试更原生的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是否可能。
答案 0 :(得分:7)
我想说服务器发送的事件在Stream Updates with Server-Sent Events文章中描述得非常好,即事件流格式。使用Firefox 6 SSE现在支持大多数现代浏览器(不幸的是除IE之外)。
我不明白如何向客户端发送特定消息。 发送预定义的消息似乎没问题。但是,如果我想象一个 有人给我发消息的情况,我不明白怎么回事 确切地说,这些信息('有一条新消息')是 传输到需要该信息的确切浏览器。
客户端通过keep-alive事件流与单向连接与SSE服务器连接,单向连接在浏览器/选项卡关闭之前未关闭,用户调用close方法或网络连接丢失。
基本上,我需要的是一种说'嘿,你被允许得到的方式 这个通知?首先告诉我你的身份/会话/令牌!'在一个 连接客户基础。我想知道SSE是否可能。
这种身份验证逻辑需要在服务器端执行,因此它取决于您使用的语言或平台。除非你的环境中有库,否则你可能不得不写它。
答案 1 :(得分:7)
规范已经改变/发展。当前版本使用EventSource
对象。 HTML元素消失了。
当前的MIME类型为text/event-stream
。 x-dom-event-stream
仅用于早期实现(2006年的Opera)。
要识别/验证客户端,您可以使用Cookie或连接到包含某种身份验证令牌(会话ID)的事件流URL,然后您就会知道特定的TCP / IP连接与该用户相关联
答案 2 :(得分:1)
添加@ porneL的答案;您可以告诉EventSource
将Cookie包含在它发送的请求中。只需像这样创建EventSource
对象:
var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:true});
我使用最新版本的chrome和firefox进行了测试。
来源:http://www.sitepoint.com/server-sent-events/
编辑:显然这不是必需/无用的。请参阅@Tamlyn的评论。