Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 服务器发送的事件究竟是如何工作的?_Javascript_Perl_Server Sent Events - Fatal编程技术网

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

Javascript 服务器发送的事件究竟是如何工作的?,javascript,perl,server-sent-events,Javascript,Perl,Server Sent Events,我试图进入网络推送技术,所以我开始四处看看。我基本上找到了两种技术,即WebSocket和SSE。在由于缺少perl支持而排除WebSocket之后,我想尝试更原生的SSE方法 现在,试图让SSE工作真是一件痛苦的事。每一份文件都有相互矛盾的信息,对于SSE的工作方式似乎没有达成普遍共识。有人说你需要一个标记,也有人说你只需要一个EventSourceJS对象。即使使用EventSource对象,我也发现了大约4种可能的实现,但它们似乎都不起作用 这是我的。我有一个events.pm,它使用mo

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

现在,试图让SSE工作真是一件痛苦的事。每一份文件都有相互矛盾的信息,对于SSE的工作方式似乎没有达成普遍共识。有人说你需要一个
标记,也有人说你只需要一个
EventSource
JS对象。即使使用EventSource对象,我也发现了大约4种可能的实现,但它们似乎都不起作用

这是我的。我有一个
events.pm
,它使用mod perl。如果调用该文件,它将返回
数据:I haz a websocket
。它与内容类型
应用程序/x-dom-event-stream
一起发送

HTML和JS文件经常用不同的实现重写,我已经放弃了它们。你们能给我举个有效的例子吗

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

编辑
基本上,我需要的是一种说‘嘿,你可以得到这个通知吗?首先显示您的id/会话/令牌!'基于每个连接的客户端。我想知道SSE是否有可能。我想说的是,本文中对服务器发送的事件进行了很好的描述,即事件流格式。在Firefox6中,大多数现代浏览器(不幸的是IE除外)都支持SSE

我不明白您如何向客户发送特定消息。 发送预定义的消息似乎没问题。然而,如果我想象一个 有人给我发信息的情况,我不明白怎么办 确切地说,该信息(“有一条新消息要告诉你”)是 传输到需要该信息的浏览器

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

基本上,我需要的是一种方式来说‘嘿,你可以进来吗 这个通知?首先显示您的id/会话/令牌!'根据 连接客户基础。我想知道苏格兰和南方能源公司是否有可能


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

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

当前MIME类型为
文本/事件流
x-dom-event-stream
仅在早期实现中使用(Opera于2006年)

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


增加@porenel的答案;您可以告诉
EventSource
将cookie包含到它发送的请求中。只需像这样创建
EventSource
对象:

var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:true});
我用最新版本的chrome和firefox对此进行了测试

资料来源:


编辑:显然这不是必需的/无用的。请参阅@Tamlyn的评论。

您知道SSE目前仅适用于Chrome、Opera和Safari,对吗?Mojo framework支持WebSocket。从同一页面上看,“[withCredentials]仅适用于需要用户凭据(Cookie)的跨源请求。到目前为止,没有浏览器支持跨源事件源请求。”@谢谢你的更正。当我进行测试时,不知何故没有包括凭证。一定和我的测试设置有关。