服务器发送的事件究竟是如何工作的

How exactly does Server-Sent Events work?

本文关键字:何工作 工作 事件 究竟 服务器      更新时间:2023-09-26

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

现在,试图让苏格兰和南方能源公司工作真的很痛苦。每一份文件都有相互矛盾的信息,而且似乎对SSE的工作方式没有达成普遍共识。有人说你需要一个<event-listen src="events.pm">标签,还有人说你只需要一个EventSourceJS对象。即使使用EventSource对象,我也发现了大约4种可能的实现,但它们似乎都不起作用。

这是我的东西。我有一个events.pm,它使用modperl。如果调用该文件,它将返回data: I haz a websocket。这是用内容类型application/x-dom-event-stream发送的。

HTML和JS文件经常被不同的实现重写,以至于我放弃了它们。你们能给我举个例子吗?

此外:我不明白你如何向客户发送特定的消息。发送预定义的消息似乎很好。然而,如果我想象有人给我发消息的情况,我不明白这些信息("这是给你的新消息")是如何传输到需要这些信息的浏览器的。我在这上面发现的每一篇帖子充其量都是模糊的。

编辑

基本上,我需要的是一种方式来说‘嘿,你被允许收到这个通知吗?先给我看看你的id/session/token!'基于每个连接的客户端。我想知道苏格兰和南方能源公司是否有可能做到这一点。

我想说,在"使用服务器发送的事件进行流更新"一文中,即"事件流格式"中,对服务器发送事件的描述非常好。现在大多数现代浏览器都支持Firefox 6 SSE(不幸的是,IE除外)。

我不明白你如何向客户发送特定的消息。发送预定义的消息似乎很好。然而,如果我想象有人给我发信息的情况,我不明白是怎么回事确切地说,这些信息("这是给你的新消息")传输到需要该信息的确切浏览器。

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

基本上,我需要的是一种方式来说‘嘿,你被允许得到吗这个通知?先给我看看你的id/session/token!'在连接客户端基础。我想知道苏格兰和南方能源公司是否有可能做到这一点。

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

规范发生了变化。当前版本使用EventSource对象。HTML元素不见了。

当前MIME类型为text/event-streamx-dom-event-stream仅在早期实现中使用(Opera于2006年)。

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

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

添加到@porneL的答案;您可以告诉EventSource在其发送的请求中包含cookie。只需创建EventSource对象,如下所示:

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

我用最新版本的chrome和firefox进行了测试。

来源:http://www.sitepoint.com/server-sent-events/

编辑:显然这没必要/没用。请参阅@Tamlyn的评论。