Ahm*_*man 41 server-sent-events
所以我理解服务器发送事件的概念(EventSource
):
EventSource
我很困惑的是它在服务器上是如何工作的.我看了一下不同的例子,但想到的一个是Mozilla的:http://hacks.mozilla.org/2011/06/a-wall-powered-by-eventsource-and-server-sent-事件/
现在这可能只是一个不好的例子,但是根据我的理解,服务器端如何工作有点有道理:
那有意义吗?从准确的角度来看,它真的是如何运作的吗?
Mar*_*ade 56
HTML5医生网站对服务器发送的事件进行了很好的记录,但我也试着在这里提供一个(合理的)简短摘要.
服务器发送的事件的核心是长连接的http连接,一个特殊的mime type(text/event-stream
)和一个提供EventSource
API 的用户代理.它们共同构成了服务器和客户端之间单向连接的基础,消息可以从服务器发送到客户端.
在服务器端,它相当简单.您真正需要做的就是设置以下http标头:
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
请务必使用代码200
而不是代码204
或任何其他代码进行响应,因为这会导致兼容的用户代理断开连接.另外,请确保不要在服务器端结束连接.您现在可以自由地开始按下该连接.在nodejs(使用express)中,这可能类似于以下内容:
app.get("/my-stream", function(req, res) {
res.status(200)
.set({ "content-type" : "text/event-stream"
, "cache-control" : "no-cache"
, "connection" : "keep-alive"
})
res.write("data: Hello, world!\n\n")
})
Run Code Online (Sandbox Code Playgroud)
在客户端,您只需使用EventSource
API,如您所述:
var source = new EventSource("/my-stream")
source.addEventListener("message", function(message) {
console.log(message.data)
})
Run Code Online (Sandbox Code Playgroud)
就是这样,基本上就是这样.
现在,实际上,这里实际发生的是服务器和客户端通过相互契约保持连接.只要认为合适,服务器就会保持连接的活动状态.如果需要,它可以终止连接并在204 No Content
下次客户端尝试连接时进行响应.这将导致客户端停止尝试重新连接.我不确定是否有办法以客户端被告知不重新连接的方式结束连接,从而跳过尝试重新连接一次的客户端.
如上所述,客户端也将保持连接活动,并尝试重新连接,如果它被删除.重新连接的算法在规范中指定,并且非常简单.
然而,我到目前为止几乎没有触及的一个非常重要的部分是mime类型.mime类型定义了连接下来的消息格式.但请注意,它并没有规定消息内容的格式,只是消息本身的结构.哑剧类型非常直接.消息本质上是键/值对信息.密钥必须是预定义集之一:
应忽略任何其他键.然后通过使用两个换行符来分隔消息:\n\n
以下是有效消息:(为了详细程度而添加的最后一个新行字符)
data: Hello, world!
\n
Run Code Online (Sandbox Code Playgroud)
客户会将此视为:Hello, world!
.
就是这样:
data: Hello,
data: world!
\n
Run Code Online (Sandbox Code Playgroud)
客户会将此视为:Hello,\nworld!
.
这几乎总结了服务器发送的事件:长时间运行的非缓存http连接,mime类型和简单的JavaScript API.
有关更多信息,我强烈建议您阅读规范.它很小并且描述的东西非常好(虽然服务器端的要求可能会更好地总结.)我强烈建议阅读它以获得某些http状态代码的预期行为.
归档时间: |
|
查看次数: |
9814 次 |
最近记录: |