HTML5服务器端事件:EventSource与包装的WebSocket

时间:2011-12-14 03:21:46

标签: javascript html5 websocket server-sent-events

HTML5服务器发送事件(SSE)API是否仅是基于事件的受限API,位于HTML5 WebSockets之上?

在我看来,EventSource只是WebSocket

  1. 无法.send()数据
  2. 使用text/event-stream格式
  3. 触发动态命名(服务器定义)事件而不是onmessage
  4. Web服务器将事件推送到客户端设备的想法非常有趣。这个API有牵引力吗?

    我认为异步事件模型在与Node结合时会很漂亮,但在我的ASP.NET世界中没有看到很多用例。

2 个答案:

答案 0 :(得分:7)

服务器发送事件在仅需要服务器推送的应用程序中非常有用,而Web套接字适用于需要双向快速通信的应用程序。

服务器发送事件是一个很好的解决方案的例子是:

  • 股票价值变动
  • 新闻提要

服务器已发送事件会执行Web套接字中未内置的更多操作,例如自动重新连接 eventIDs

截至今天,服务器已发送事件还支持更广泛的Web浏览器,并支持Safari(仅支持较旧的Web套接字草稿)和Opera(默认情况下禁用Web套接字,并使用较旧的草稿)。

详细了解Stream Updates with Server-Sent Events上的服务器已发送事件。

答案 1 :(得分:5)

除了Jonas所说的,协议完全不同。

  • The WebSocket Protocol(RFC 6455)作为HTTP连接启动,然后使用握手升级与新协议的连接。这是一个使用框架,消息类型等的二进制协议。

  • Server-Sent Events是一个长时间运行的HTTP请求,保持打开状态。服务器以简单的基于文本的格式(UTF-8编码)发送消息,由\n\n分隔。邮件包含字段event(事件类型),dataid,并且可以选择包含评论。

一个主要区别是安全模型。使用WebSockets,默认设置是让任何人连接。必须根据Origin标题在服务器端拒绝连接。

另一方面,SSE更接近HTTP并使用同源策略。默认情况下,您只能向同一主机和端口发出请求。将来可以使用CORS来进行跨域SSE请求。截至今天,浏览器还没有实现这一点。

这两种协议采用不同的方法,因为它们解决了不同的问题。