WebSockets与服务器

WebSockets和Server-Sent Events都可以将数据推送到浏览器。 对我来说,他们似乎是竞争技术。 他们有什么区别? 你什么时候选择一个呢?


Websockets和SSE(Server Sent Events)都能够将数据推送到浏览器,但它们不是竞争技术。

Websockets连接既可以将数据发送到浏览器,也可以从浏览器接收数据。 一个可以使用websockets的应用程序的好例子是一个聊天应用程序。

SSE连接只能将数据推送到浏览器。 在线股票报价或更新时间线或订阅源的推文是可以从SSE中受益的应用的好例子。

在实践中,因为所有可以用SSE完成的事情都可以通过Websockets完成,所以Websockets得到了更多的关注和热爱,并且许多浏览器支持Websockets而不是SSE。

但是,对于某些类型的应用程序来说这可能是过分的,而后端可能更容易使用SSE等协议来实现。

此外,SSE可以填充到旧式浏览器中,而这些浏览器本身不支持JavaScript。 在Modernizr github页面上可以找到SSE polyfills的一些实现。

陷阱:

  • SSE受限于打开连接的最大数量,当打开各种选项卡时,可能会特别痛苦,因为每个浏览器的限制是极限,并且设置为非常低的数字(6)。 这个问题在Chrome和Firefox中被标记为“无法修复”
  • 只有WS可以传输二进制数据和UTF-8,SSE仅限于UTF-8。 (感谢Chado Nihi)。
  • HTML5Rocks在SSE上有一些很好的信息。 从该页面:

    服务器发送的事件与WebSockets

    为什么你会选择通过WebSockets的Server-Sent Events? 好问题。

    SSE一直处于阴影之中的原因之一是因为后来的API如WebSockets提供了更丰富的协议来执行双向全双工通信。 拥有双向频道对游戏,消息应用程序等事物更具吸引力,以及您需要双向接近实时更新的情况。 但是,在某些情况下,数据不需要从客户端发送。 你只需要一些服务器动作的更新。 一些例子是朋友的状态更新,股票报价,新闻提要或其他自动数据推送机制(例如,更新客户端Web SQL数据库或IndexedDB对象存储)。 如果你需要发送数据到服务器,XMLHttpRequest永远是朋友。

    SSE通过传统的HTTP发送。 这意味着他们不需要特殊的协议或服务器实施就可以工作。 另一方面,WebSocket需要全双工连接和新的Web Socket服务器来处理协议。 另外,Server-Sent Events具有WebSockets在设计时缺乏的各种功能,例如自动重新连接,事件ID以及发送任意事件的能力。


    TLDR总结:

    SSE优于Websockets的优势:

  • 通过简单的HTTP而不是自定义协议传输
  • 可以使用JavaScript进行poly填充,以将“SSE”“backport”到尚不支持它的浏览器。
  • 内置支持重新连接和事件ID
  • 更简单的协议
  • Websockets比SSE的优势:

  • 实时,双向沟通。
  • 在更多浏览器中提供原生支持
  • SSE的理想用例:

  • 股票代码流
  • twitter feed更新
  • 通知浏览器
  • SSE陷阱:

  • 没有二进制支持
  • 最大打开连接数限制

  • 根据caniuse.com:

  • 全球90%的用户本身支持WebSocket
  • 全球84%的用户本地支持服务器发送的事件
  • 您可以使用仅客户端的polyfill将SSE的支持扩展到许多其他浏览器。 WebSockets的可能性较小。 一些EventSource填充:

  • Remy Sharp的EventSource没有其他库依赖项(IE7 +)
  • 由Rick Waldron提供的jQuery.EventSource
  • Yaffle的EventSource(取代原生实现,规范跨浏览器的行为)
  • 如果您需要支持所有浏览器,请考虑使用像web-socket-js,SignalR或socket.io这样的库,它支持多种传输方式,例如WebSockets,SSE,Forever Frame和AJAX长轮询。 这些通常也需要对服​​务器端进行修改。

    了解更多关于SSE的信息:

  • HTML5 Rocks文章
  • W3C规范(发布版本,编辑草案)
  • 通过以下网址了解更多关于WebSockets

  • HTML5 Rocks文章
  • W3C规范(发布版本,编辑草案)
  • 其他差异:

  • WebSockets支持任意的二进制数据,SSE只使用UTF-8

  • Opera,Chrome,Safari支持SSE,Chrome,Safari支持SSE里面的SharedWorker Firefox支持XMLHttpRequest readyState交互,所以我们可以为Firefox制作EventSource polyfil

    链接地址: http://www.djcxy.com/p/31325.html

    上一篇: WebSockets vs. Server

    下一篇: How do you define a custom angular module from npm?