17

我正在尝试进入网络推送技术,所以我开始环顾四周。我基本上找到了 2 种技术,即 Websockets 和 SSE。由于缺乏 perl 支持而排除了 Websockets 后,我想尝试更原生的 SSE 方法。

现在,试图让 SSE 发挥作用是一件非常痛苦的事情。每个文档都有相互矛盾的信息,而且似乎没有就 SSE 的工作方式达成普遍共识。有人说你需要一个<event-listen src="events.pm">标签,其他人说你只需要一个EventSourceJS 对象。即使使用 EventSource 对象,我也发现了大约 4 种可能的实现,但它们似乎都不起作用。

这就是我所拥有的。我有一个events.pm,它使用 mod-perl。如果您调用该文件,它会返回data: I haz a websocket. 这是与 content-type 一起发送的application/x-dom-event-stream

HTML 和 JS 文件经常被不同的实现重写,我已经放弃了它们。你们能给我一个工作的例子吗?

另外:我不明白您如何向客户端发送特定消息。发送预定义的消息似乎很好。但是,如果我想象有人向我发送消息的情况,我不明白该信息(“有一条新消息给您”)是如何准确地传输到需要该信息的那个浏览器的。我在这方面找到的每一篇文章充其量都是模糊的。

编辑

基本上,我需要的是一种说‘嘿,你可以收到这个通知吗?先给我看看你的 id/session/token!基于每个连接的客户端。我想知道 SSE 是否有可能。

4

3 回答 3

8

我想说服务器发送的事件在带有服务器发送事件的流更新文章中描述得很好,即事件流格式。现在大多数现代浏览器都支持 Firefox 6 SSE(不幸的是,除了 IE)。

我不明白您如何向客户端发送特定消息。发送预定义的消息似乎很好。但是,如果我想象有人向我发送消息的情况,我不明白该信息(“有一条新消息给您”)是如何准确地传输到需要该信息的那个浏览器的。

客户端通过keep-alive事件流与SSE服务器连接,单向连接在浏览器/选项卡关闭之前不会关闭,用户调用关闭方法或网络连接丢失。

基本上,我需要的是一种说‘嘿,你可以收到这个通知吗?先给我看看你的 id/session/token!基于每个连接的客户端。我想知道 SSE 是否有可能。

这种身份验证逻辑需要在服务器端执行,因此它取决于您使用的语言或平台。除非您的环境中有相应的库,否则您可能必须编写它。

于 2011-09-02T18:55:32.237 回答
7

规范已更改/演变。当前版本使用EventSource对象。HTML 元素消失了。

当前的 MIME 类型是text/event-stream. x-dom-event-stream仅在早期实现中使用(2006 年的 Opera)。

要识别/验证客户端,您可以使用 cookie 或连接到包含某种身份验证令牌(会话 ID)的事件流 URL,然后您就会知道特定的 TCP/IP 连接与该用户相关联。

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

于 2013-01-09T00:57:50.657 回答
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 的评论。

于 2014-04-15T12:37:52.373 回答