前后端通信方案对比(传统轮询、长轮询、SSE(Server-Sent Events)、WebSocket、socket.io)

前言

最近项目中要实现一个进度条的功能,要求百分比显示服务端同步数据的进度,并实时展示服务器处理进度(实时展示进度日志)。
受领导之托,我先调研对比了以下几种前后端通信方案,应该比较全了,后续做完这个功能我会把具体实现demo分享更新上来

传统轮询(Traditional Polling)长轮询(Long Polling)SSE(Server-Sent Events)WebSocketsocket.io
浏览器支持几乎所有现代浏览器几乎所有现代浏览器Firefox 6+ Chrome 6+ Safari 5+ Opera 10.1+;不支持 IE 浏览器IE 10+ Edge Firefox 4+ Chrome 4+ Safari 5+ Opera 11.5+几乎所有现代浏览器
实现方式setInterval或者setTimeoutsetInterval或者setTimeout,设置一个较大的timeout值HTML5 new EventSource()HTML5 new WebSocket()Socket.IO库,封装了 WebSocket 和其他实时通信协议,并提供了一组易于使用的 API。它既可以在客户端上使用,也可以在服务器端上使用,它还提供了许多高级功能,例如自动重连、心跳机制和房间等概念。自带多种传输方式,如 WebSocket、HTTP 长轮询、JSONP 等,可以根据浏览器或设备的不同选择最佳传输方式。
协议和通信方式普通http普通httphttp,服务端->客户端单向通信TCP,双向通信*
服务器负载较少的CPU资源,较多的内存资源和带宽资源与传统轮询相似,但是占用带宽较少与长轮询相似,除非每次发送请求后服务器不需要断开连接无需循环等待(长轮询),CPU和内存资源不以客户端数量衡量,而是以客户端事件数衡量。四种方式里性能最佳。*
客户端负载占用较多的内存资源与请求数。与传统轮询相似。 浏览器中原生实现,占用资源很小。同Server-Sent Event。*
延迟非实时,延迟取决于请求间隔。 同传统轮询。 非实时,默认3秒延迟,延迟可自定义。 实时。 *
实现复杂度非常简单。 需要服务器配合,客户端实现非常简单。 websocket轻量级的替代品,需要服务器配合,而客户端实现甚至比前两种更简单。 需要Socket程序实现和额外端口,客户端实现简单。 使用 Socket.IO 的应用程序需要使用 Socket.IO 作为通信层,不能在应用程序中集成原生 WebSocket 或 EventSource。对比 EventSource 和 WebSocket,Socket.IO 相对来说更加庞大,需要引入相应的客户端库和服务器端插件,如果应用程序只需要简单的实时通信,使用 EventSource 或 WebSocket 可能更加适合
数据类型http contentTypehttp contentType 无法发送二进制数据。 服务器响应格式: 服务器发送由 \n\n 分隔的消息。 一条消息可能有以下字段: 1. data: —— 消息体(body),一系列多个 data 被解释为单个消息,各个部分之间由 \n 分隔。 2. id: —— 更新 lastEventId,重连时以 Last-Event-ID 发送此 id。 3. retry: —— 建议重连的延迟,以 ms 为单位。无法通过 JavaScript 进行设置。 4. event: —— 事件名,必须在 data: 之前。 一条消息可以按任何顺序包含一个或多个字段,但是 id: 通常排在最后。可以发送二进制数据,支持大文件传输 *
安全性同http请求同http请求只监听服务器推送的消息,安全性较高需要注意防止 CSRF 和 XSS 攻击,避免恶意用户利用 WebSocket 劫持会话或注入脚本等。 *
  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: WebsocketSocket.io 都是用于在客户端和服务端之间建立双向通信的协议。 Websocket 是一种协议,它提供了一种在单个 TCP 连接上进行全双工通信的方法。这意味着可以在两端之间同时传输数据。它使用了浏览器中的 JavaScript 对象来创建 WebSocket 连接。 Socket.io 是一个基于 Websocket 的实时库,它封装了 Websocket 的细节,并提供了自动的跨浏览器兼容性。它还支持自动重连、自动检测网络状况、以及其他一些实用的功能。 总的来说,Websocket 是一种通信协议,而 Socket.io 是一个库,它在使用 Websocket 的基础上提供了更多的功能。 ### 回答2: WebSocketSocket.io都是用于实现实时通信的协议,但它们在功能和实现上有一些区别。 WebSocket是一种基于TCP的通信协议,它提供了双向通信的能力。它可以在客户端和服务器之间建立持久的连接,并通过该连接传输数据。WebSocket使用简单的握手过程建立连接,然后可以发送和接收数据,而无需经过HTTP的请求-响应循环。由于它是一种底层协议,WebSocket可以直接与服务器进行通信,适用于实现实时的双向通信Socket.io是一个基于WebSocket的库,它提供了一些额外的功能和特性。与WebSocket相比,Socket.io更加灵活,能够适应不同的环境和网络条件。Socket.io可以自动检测和选择最佳的传输协议,包括WebSocket、AJAX和轮询等。这使得Socket.io可以在不同的浏览器和设备上工作,并且可以处理浏览器兼容性问题。此外,Socket.io还提供了一些高级功能,如房间和命名空间的概念,用于组织和管理连接。 总结来说,WebSocket是一种底层协议,提供了双向通信的能力,而Socket.io是一个基于WebSocket的库,提供了更多的功能和便利性。如果只需要简单的双向通信,可以使用WebSocket;如果需要更多的功能和灵活性,可以选择Socket.io来实现实时通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厉害坤坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值