Web实时通信的学习之旅:轮询、WebSocket、SSE的区别以及优缺点

文章目录

      • 一、通信机制
        • 1、轮询
          • 1.1、短轮询
          • 1.2、长轮询
        • 2、Websocket
        • 3、Server-Sent Events
      • 二、区别
        • 1、连接方式
        • 2、协议
        • 3、兼容性
        • 4、安全性
        • 5、优缺点
          • 5.1、WebSocket 的优点:
          • 5.2、WebSocket 的缺点:
          • 5.3、SSE 的优点:
          • 5.4、SSE 的缺点:
        • 6、技术实现
        • 7、数据格式
        • 8、连接状态
      • 三、示例代码:
        • 1、WebSocket 示例:
        • 2、SSE 示例:
      • 四、总结

一、通信机制

一个网页获取新的数据通常需要发送一个请求到服务器,也就是向服务器请求的页面。使用服务器发送事件,服务器可以随时向我们的 Web 页面推送数据和信息。这些被推送进来的信息可以在这个页面上以 事件 + 数据 的形式来处理。

1、轮询

顾名思义,轮询就是在某个时间间隔内定期向服务器发送请求。其中轮询有分为短轮询和长轮询。这是一种客户端主动请求的方式。

1.1、短轮询

定期向服务器请求,无论请求的资源是否可用,服务器都会尽快响应,客户端再次发起下次轮询。这种方式会比较消耗网络带宽,如果资源一直不可用就会有很多不必要的请求发送到服务器。

在这里插入图片描述

1.2、长轮询

定期向服务器发送请求,与短轮询不同的是,在资源不可用时长轮询不会立即将连接关闭,而是会等待资源可用后在响应客户端。或者等待了一段时间资源任然不可用(超时)服务器将连接关闭,客户端等待一段时间后再次发起请求。

在这里插入图片描述

与短轮询相比,长轮询更高效一些,请求数量减少了很多。

2、Websocket

在客户端和服务器打开交互式的通信会话。这是一种全双工通信,客户端与服务器会建立一个持久连接,服务器可以主动发送数据给客户端。客户端可以通过监听事件来处理来自服务器的消息。与轮询的方式相比,大大减少了延迟,没有了数据更新的往返时间。

在这里插入图片描述

3、Server-Sent Events

服务器发送事件,SSE会建立一个持久的HTTP连接。建立连接后服务器可以主动往客户端推送数据。与websocket不同,这是一种单向通信的方式,即建立连接后客户端不能向服务器发送数据。

在这里插入图片描述

二、区别

1、连接方式
  • WebSocket

WebSocket 是双向通信,客户端和服务器可以相互发送消息;

  • SSE

SSE 是单向通信,只能由服务器向客户端发送消息。

2、协议
  • WebSocket

WebSocket 使用的是 WebSocket 协议

  • SSE

SSE 使用的是 HTTP 协议

3、兼容性
  • WebSocket

WebSocket 在一些老版本 Android 手机上可能存在兼容性问题,需要使用一些特殊的 API 进行处理。

在这里插入图片描述

  • SSE

SSE 是标准的 Web API,可以在大部分现代浏览器和移动设备上使用。但如果需要兼容老版本的浏览器(如 IE6/7/8),则需要使用 polyfill 库进行兼容。

在这里插入图片描述

4、安全性
  • SSE 的实现比较简单,都是基于 HTTP 协议的,与普通的 Web 应用没有太大差异,因此风险相对较低。

  • WebSocket 则需要通过额外的安全措施(如 SSL/TLS 加密)来确保数据传输的安全性,避免被窃听和篡改,否则可能会带来安全隐患。

5、优缺点
5.1、WebSocket 的优点:
  • 实时性高:WebSocket 可以实现双向实时通信,数据传输速度快。

  • 低延迟:WebSocket 的延迟较低,适用于对实时性要求较高的场景。

  • 全双工:WebSocket 支持全双工通信,即客户端和服务器可以同时发送和接收数据。

5.2、WebSocket 的缺点:
  • 兼容性差:WebSocket 的支持程度不如 SSE,部分旧版本浏览器不支持。

  • 实现复杂:WebSocket 的实现相对复杂,需要处理更多的细节。

5.3、SSE 的优点:
  • 兼容性好:SSE 的支持程度较高,所有现代浏览器都支持。

  • 实现简单:SSE 的实现相对简单,只需监听服务器发送的消息即可。

  • 实时性:SSE 可以实现服务器向客户端推送消息,满足实时性需求。

5.4、SSE 的缺点:
  • 单向通信:SSE 只能由服务器向客户端发送消息,无法实现双向通信。

  • 传输速度较慢:SSE 的数据传输速度相对较慢,可能不适用于对实时性要求极高的场景。

6、技术实现
  • SSE 基于 HTTP 协议,利用了其长连接特性,通过浏览器向服务器发送一个 HTTP 请求,建立一条持久化的连接。

  • WebSocket 则是通过特殊的升级协议(HTTP/1.1 Upgrade 或者 HTTP/2)建立新的 TCP 连接,与传统 HTTP 连接不同。

7、数据格式
  • SSE 可以传输文本和二进制格式的数据,但只支持单向数据流,即只能由服务器向客户端推送数据。

  • WebSocket 支持双向数据流,客户端和服务器可以互相发送消息,并且没有消息大小限制。

8、连接状态
  • SSE 的连接状态仅有三种==:已连接、连接中、已断开==。连接状态是由浏览器自动维护的,客户端无法手动关闭或重新打开连接。

  • WebSocket 连接的状态更灵活,可以手动打开、关闭、重连等。

三、示例代码:

1、WebSocket 示例:
// 创建 WebSocket 连接
const socket = new WebSocket('ws://example.com/socket');

// 连接打开时触发
socket.addEventListener('open', (event) => {
    console.log('WebSocket 连接已打开');
});

// 接收到服务器消息时触发
socket.addEventListener('message', (event) => {
    console.log(www.5ahospital.com/anli/90.html);
});

// 发送消息到服务器
socket.send('Hello, WebSocket!');
2、SSE 示例:
// 创建 EventSource 对象
const source = new EventSource('http://example.com/sse');

// 接收到服务器消息时触发
source.addEventListener('message', (event) => {
    console.log('收到服务器消息:', event.data);
});

四、总结

  • WebSocket比SSE功能更加强大,WebSocket是在服务端和客户端建立的双向实时数据通道,而SSE只支持服务端想客户端的单向通讯

  • 浏览器对WebSocket的支持也更加广泛,IE、Edge几乎不支持SSE

  • WebSocket有一套独立的标准协议,在使用过程中必须按照标准协议来,而SSE使用的是Http协议,只需要更改Context-Type为"text/event-stream; charset=utf-8"即可,这里需要特殊注意的一点,必须是utf-8

  • SSE 属于轻量级,使用特别简单,WebSocket协议相对复杂些

  • SSE 内置断线重连和消息追踪的功能,WebSocket的也能实现,但是不在协议范围内,需要手动实现

  • SSE 只支持纯文本传送(如果需要发送二进制文本的话,需要先编码下然后再传送),WebSocket不仅支持文本还支持二进制数据传送

  • SSE 支持自定义发送的消息类型(Type)

  • SSE 适合服务器发送单向事件,心跳之类的简单数据,WebSocket试用于前后端通讯,例如聊天服务等,具体场景具体对待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/612206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实用的Chrome命令 帮你打开Chrome浏览器的隐藏功能

前言 Chrome作为主力浏览器,支持相当丰富的第三方扩展,其实浏览器本身也内置了大量实用的命令。许多实用的功能并没有直接显示在Chrome的菜单上。在这篇文章中,我们将介绍几个实用的chrome:// commands。 通过下面整理的 Chrome 命令&#x…

nginx_01

1.安装 yum install epel-release -y # 安装yum的扩展包 yum install nginx -y systemctl start nginx.service #启动nginx systemctl enable nginx.service # netstat -lntup # 查看端口占用情况 # 可以看到nginx默认占用了80端口 2.nginx配置 # 注意配置文件的语法格式…

macOS Sonoma 无法打开分段式Dmg文件的解决办法

在macOS Sonoma 14.X及更高版本的系统中,用户可能会遇到一个棘手的问题:无法直接打开“分段式”DMG(磁盘映像)安装包文件。这种情况通常发生在尝试安装一些大型软件或游戏时,尤其是那些因为文件体积巨大而采用分段压缩…

开源AI大模型测评网站

1、排行榜 多个 AI 模型的排行榜和详细的性能评估,包括总排行榜、基础能力排行榜、安全类模型排行榜、金融领域应用排行榜、汽车领域应用排行榜以及工业领域应用排行榜 地址:SuperCLUEhttps://www.superclueai.com/ 2.报告合集 内容体系:代表性的数据集、基线(预训练)模型…

Kivy UI界面

一、版本介绍 Ubuntu:18.04.6 LTS Conda:4.5.12 Python:3.6.15 Kivy:2.0.0 二、安装Kivy # 更新系统包列表 sudo apt-get update# 安装Kivy的依赖项 sudo apt-get install -y python-pip libsdl2-dev libsdl2-image-dev li…

【JavaWeb】网上蛋糕商城后台-商品管理

概念 本文讲解和实现网上蛋糕商城的后台管理系统中的商品管理功能。 商品列表 点击后台管理系统的head.jsp头部的“商品管理”功能选项,向服务器发送请求/admin/goods_list 因此需要在servlet包中创建AdminGoodsListServlet类,用于获取商品信息列表 …

TDM(BPM)-MIMO-FMCW雷达MATLAB仿真

本文通过对车载毫米波雷达信号流程和链路的仿真,建立基本的算法框架,可用于算法性能的验证。并提供基础MATLAB仿真代码,作为分享和参考。 一、信号的产生 车载毫米波雷达广泛使用线性调频连续波雷达,也即发射信号频率随时间线性变…

C++ | Leetcode C++题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution { public:bool exist(vector<vector<char>>& board, string word) {rows board.size();cols board[0].size();for(int i 0; i < rows; i) {for(int j 0; j < cols; j) {if (dfs(board, word, i, …

面向对象设计之套路——设计模式

1、总则 面向对象的分析设计编程思想&#xff0c;通过封装、继承、多态把程序的耦合度降低&#xff0c;用设计模式使得程序更加灵活&#xff0c;容易修改&#xff0c;并且易于复用。 让业务逻辑与界面逻辑分开&#xff0c;让它们的耦合度下降&#xff0c;只有分离&#xff0c;…

jenkins部署想定报错

报错&#xff1a; 解决办法&#xff1a; 登录被编译的设备&#xff0c;清楚旧代码&#xff0c;在重新执行

亲测有效!关键点检测——COCO格式转YOLO格式代码!!!

话不多收&#xff0c;直接上代码&#xff0c;这个我也是找了好久的&#xff0c;分享不易&#xff0c;给个鼓励&#xff01;&#xff08;记得点赞收藏&#xff09; 大家可以直接使用此代码转换你自己的数据集&#xff0c;路径换成你自己的就行了&#xff0c;注意路径格式&#x…

Springboot集成SpringbootAdmin实现服务监控管理-10

SpringbootAdmin Spring Boot Admin是一个用于管理和监控Spring Boot应用程序的开源软件。 概要介绍 Spring Boot Admin可以监控Spring Boot单机或集群项目&#xff0c;它提供了详细的健康&#xff08;Health&#xff09;信息、内存信息、JVM系统和环境属性、垃圾回收信息、…

AI自动生成PPT工具上新

AI大模型能力持续增强&#xff0c;零一万物&#xff08;李开复领导的团队&#xff09;推出的万知只是其中的一个缩影&#xff0c;生成PPT也只是其中一个能力。 如果你还没用WPSAI的PPT自动生成能力&#xff08;WPS Office AI实战总结&#xff0c;智能化办公时代已来&#xff09…

web安全之登录框渗透骚姿势,新思路

不管漏洞挖掘还是挖SRC&#xff0c;登录框都是重点关注对象&#xff0c;什么漏洞都有可能出现&#xff0c; 本篇文章做个总结&#xff0c;后面发现新思路后会继续更新 万能密码 or 弱口令 SQL注入 水平越权 垂直越权 逻辑漏洞 短信轰炸 邮箱轰炸 信息泄露 验证码DOS XSS万能密…

【C++模板入门】

C模板入门 泛型编程函数模板格式原理函数模板的实例化 类模板 泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp l…

信安标委发布16项网络安全国家标准:8项为旧标准替代,8项标准为新发布

1. 背景 根据2024年4月25日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告&#xff08;2024年第6号&#xff09;&#xff0c;全国网络安全标准化技术委员会归口的16项国家标准正式发布。 2. 标准清单 本次国家标准涵盖了信息技术安全评估准则、…

【oj题】环形链表

目录 一. OJ链接&#xff1a; 环形链表 【思路】 快慢指针 ​编辑【扩展问题】 为什么快指针每次走两步&#xff0c;慢指针走一步可以解决问题&#xff1f; ​编辑【扩展问题】快指针一次走3步&#xff0c;走4步&#xff0c;...n步行吗&#xff1f; 二. OJ链接&#xff1a…

栈和队列初级题目(包含四个题)

目录 一、原题链接&#xff1a; 二、有效的括号&#xff1a; ​编辑代码实现&#xff1a; 三、用队列实现栈&#xff1a; 四、用栈实现队列&#xff1a; 五、设计循环队列&#xff1a; 六、读书分享&#xff1a; 一、原题链接&#xff1a; 20. 有效的括号 225. 用队列实…

理解Go语言中的测试种类

测试金字塔将测试分为不同的类别,如下图所示 单元测试在金字塔的底部。大部分测试都是单元测试,它们编写成本代、执行速度快且执行结果高度确定。通常,越往金子塔的上层走,测试变得越复杂,运行速度越慢,并且越难保证执行结果的确定性。 一个常见的技巧是明确说明要运行哪…

maven的安装与配置(超详细)

在Java开发中&#xff0c;配置Maven环境有几个重要的原因&#xff1a; 依赖管理&#xff1a;Maven 是一个强大的依赖管理工具&#xff0c;它能够帮助开发人员轻松地管理项目所需的各种第三方库和组件。通过在项目的 Maven 配置文件&#xff08;pom.xml&#xff09;中定义依赖&…