随着 Web 应用程序的发展,越来越多的需求需要在浏览器和服务器之间实时通信,例如在线聊天、股票行情等等。传统的 HTTP 请求-响应模式不能满足这些需求,因为它需要客户端发起请求,而服务器只能在收到请求后才能响应。这就引出了两种主要的实时通信技术:Comet 和 Server-sent Events。
Comet
Comet 是一种通过长轮询或 iframe 流实现的实时通信技术。它通过不断地向服务器发送请求,以检查数据是否可用。如果有数据可用,服务器就会将响应发送回客户端。由于 Comet 依赖于轮询机制,因此它会消耗大量的带宽和服务器资源,而且会造成延迟和最多只能进行半双工通信的缺点。
-- -------------------- ---- ------- -------- --------------- - --- --- - --- ----------------- --------------- -------- ------ ---------------------- - ---------- - -- --------------- --- - -- ---------- --- ---- - --- ---------- - ----------------- -- -- --------- ---- ---------- - -- ----------- - -------------------------- ------
上面的代码演示了 Comet 的长轮询机制。每秒钟向服务器发送一个 GET 请求,并在请求完成后更新客户端页面上的数据。
Server-sent Events
Server-sent Events 是一种新的 HTML5 标准,可以用来实现基于事件的实时通信。服务器可以使用 Server-sent Events 发送任何类型的数据,例如文本、JSON 和 XML,而客户端可以通过一个 EventSource 对象监听这些事件。
由于 Server-sent Events 是基于事件的,因此它具有双向通信和实时性更好的特点。它还可以自适应地调整带宽使用率,因为只有服务器有一个长连接,并且只需要在有新数据时发送一个事件。
var source = new EventSource('/stream'); source.addEventListener('message', function(event) { var data = JSON.parse(event.data); // Do something with data });
上面的代码演示了 Server-sent Events 的用法。在客户端创建一个 EventSource 对象并监听来自服务器的 message 事件。当服务器发送一个新的数据包时,客户端会自动接收到这个事件,并在回调函数中进行处理。
适用场景
Comet 和 Server-sent Events 都可以用来实现实时通信,但它们的适用场景略有不同。Comet 更适合那些需要与旧版浏览器兼容的应用程序,因为它可以在所有主流的 Web 浏览器上运行。而 Server-sent Events 更适合那些不需要兼容旧版浏览器,并且需要更高实时性和双向通信的应用程序。
总的来说,Server-sent Events 是一种更优秀的实时通信技术,它具有更好的性能和更多的功能。Comet 仍然是一种有效的技术,但在大多数情况下它已经过时了。
结论
本文介绍了 Server-sent Events 和 Comet 两种实时通信技术,并分析了它们的优缺点和适用场景。作为前端开发者,我们应该根据具体需求选择合适的技术来实现实时通信功能。
-- -------------------- ---- ------- -- ----------- ------ ---- ----- ---- - ---------------- ----------------------- ---- -- - ----------------------------- --------------------- ------------------------------ ------------ --------------------------- -------------- -------------- -- - ----- ---- - -------------- ---------------- -------------- -- ------ --------------- -- -- - ------------------- -- ------- -- ------------------------------- ---
上面的代码演示了如何使用 Node.js 和 HTTP 模块创建一个简单的 Server-sent Events 服务器。在每 2 秒钟发送一个随机数给客户端。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676d307082fcee791c659008