直播间讨论区需要WebSocket,简单了解下

news2024/9/23 3:17:21

由于 http 存在一个明显的弊端(消息只能有客户端推送到服务器端,而服务器端不能主动推送到客户端),导致如果服务器如果有连续的变化,这时只能使用轮询,而轮询效率过低,并不适合。于是 WebSocket被发明出来。

WebSocket技术在直播间讨论区中通常被使用。WebSocket是一种在Web浏览器和服务器之间建立持久性连接的协议,它允许实时的双向通信。相比起传统的HTTP请求-响应模式,WebSocket可以提供更快的数据传输速度和更低的延迟。

在直播间讨论区,用户可以发送消息、评论或者进行互动。通过WebSocket技术,服务器可以将这些消息实时地推送给其他观众,从而实现实时的讨论和互动体验。

通过WebSocket,直播间讨论区可以支持多个用户之间的实时消息交流,无需频繁地进行轮询或刷新页面。这种实时的交互性能使得用户能够更加方便地进行实时的互动和社交。

因此,WebSocket技术在直播间讨论区中被广泛采用,以实现实时的消息推送和交互功能。

目录

一、什么是WebSocket

二、WebSocket的特点

三、WebSocket的通信原理和机制

四、WebSocket相比于http有哪些优点

五、短轮询、长轮询和 WebSocket 间的区别

六、WebSocket 的握手

七、WebSocket使用及使用场景​​​​​​​


​​​​​​​​​​​​​​一、什么是WebSocket

   ​​​​​​​       WebSocket是一种在单个TCP连接上进行全双工通信的协议数据是通过http协议传输的,但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。客户端和服务器都可以随时向互相发送数据,能更好的节省服务器资源和带宽并达到实时通讯的目的。

二、WebSocket的特点

           1.WebSocket 采用了二进制帧结构,语法、语义与 HTTP 完全不兼容,但因为它的主要运行环境是浏览器,在使用习惯上尽量向 HTTP 靠拢。

          2.WebSocket 没有使用 TCP 的“IP 地址 + 端口号”,WebSocket 使用ws或wss协议,分别表示明文和加密的 WebSocket 协议。

三、WebSocket的通信原理和机制

          WebSocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp服务器保持长连接,数据发送是双向。

四、WebSocket相比于http有哪些优点

websocket优点:

  • ​​​​​​​支持双向通信,实时性更强;
  • 可以发送文本,也可以二进制文件;
  • 协议标识符是 ws,加密后是 wss ;
  • 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部;
  • 支持扩展。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议。(比如支持自定义压缩算法等)
  • 无跨域问题。

相同点:

  • 都是基于tcp的,都是可靠性传输协议
  • 都是应用层协议

不同点:

  • WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息
  • HTTP是单向的
  • WebSocket是需要浏览器和服务器握手进行建立连接的
  • 而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接

联系:WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的

五、短轮询、长轮询和 WebSocket 间的区别

1. 短轮询

短轮询的基本思路:
浏览器每隔一段时间向浏览器发送 http 请求,服务器端在收到请求后,不论是否有数据更新,都直接进行 响应。
这种方式实现的即时通信,本质上还是浏览器发送请求,服务器接受请求的一个过程,通过让客户端不断的进行请求,使得客户端能够模拟实时地收到服务器端的数据的变化。
优缺点
优点是比较简单,易于理解。
缺点是这种方式由于需要不断的建立 http 连接,严重浪费了服务器端和客户端的资源。当用户增加时,服务器端的压力就会变大,这是很不合理的。

2. 长轮询

​​​​​​​长轮询的基本思路:
首先由客户端向服务器发起请求,当服务器收到客户端发来的请求后,服务器端不会直接进行响应,而是先将 这个请求挂起,然后判断服务器端数据是否有更新。
如果有更新,则进行响应,如果一直没有数据,则到达一定的时间限制才返回。客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
优缺点
长轮询和短轮询比起来,它的优点是明显减少了很多不必要的 http 请求次数,相比之下节约了资源。
长轮询的缺点在于,连接挂起也会导致资源的浪费

3. WebSocket

​​​​​​​WebSocket 是 Html5 定义的一个新协议,与传统的 http 协议不同,该协议允许由服务器主动的向客户端推送信息。
使用 WebSocket 协议的缺点是在服务器端的配置比较复杂。WebSocket 是一个全双工的协议,也就是通信双方是平等的,可以相互发送消息。

六、WebSocket 的握手

从图片可知,分三个阶段

  • 打开握手
  • 数据传递
  • 关闭握手

TCP握手

客户端和服务端都需要直到各自可收发,因此需要三次握手

三次握手 

  • 第一次握手成功让服务端知道了客户端具有发送能力
  • 第二次握手成功让客户端知道了服务端具有接收和发送能力,但此时服务端并不知道客户端是否接收到了自己发送的消息
  • 所以第三次握手就起到了这个作用。`

三次握手过程中可以携带数据吗

  • 第一次、第二次握手不可以携带数据,因为一握二握时还没有建立连接,会让服务器容易受到攻击
  • 而第三次握手,此时客户端已经处于 ESTABLISHED (已建立连接状态) ,对于客户端来说,已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也是没问题的。

四次挥手 

所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放

当只有服务端把所有的报文都发送完了,才会发送 FIN 报文,告诉客户端可以断开连接了,因此在断开连接时需要四次挥手。

  • 关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了
  • 所以你未必会马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

为什么建立连接只通信了三次,而断开连接却用了四次?

  • 客户端要求断开连接,发送一个断开的请求,这个叫作(FIN)。
  • 服务端收到请求,然后给客户端一个 ACK,作为 FIN 的响应。
  • 这里你需要思考一个问题,可不可以像握手那样马上传 FIN 回去?
  • 其实这个时候服务端不能马上传 FIN,因为断开连接要处理的问题比较多,比如说服务端可能还有发送出去的消息没有得到 ACK;也有可能服务端自己有资源要释放。因此断开连接不能像握手那样操作——将两条消息合并。所以,服务端经过一个等待,确定可以关闭连接了,再发一条 FIN 给客户端
  • 客户端收到服务端的 FIN,同时客户端也可能有自己的事情需要处理完,比如客户端有发送给服务端没有收到 ACK 的请求,客户端自己处理完成后,再给服务端发送一个 ACK。

七、WebSocket使用及使用场景

1.创建websocket对象 ,通过地址客户端与服务器端的连接。

websocket 当前状态:
ws.readyState 
// 0: 'CONNECTING',表示正在连接
// 1: 'OPEN', 表示连接成功,可以通信了
// 2: 'CLOSING', 表示连接正在关闭
// 3: 'CLOSED', 表示连接已经关闭,或者打开连接失败。​​​​​​​

// 创建WebSocket连接.

const socket = new WebSocket('ws://localhost:8080');

2. 连接成功触发

    连接触发事件:

  • Socket.onopen:连接建立时触发
  • Socke.onmessage:客户端接受服务端数据时触发
  • Socket.onerror:通信错误时触发
  • Socket.onclose:连接关闭时触发
 
ws.onopen = function () {

// 指定连接成功后的回调函数

}

ws.onclose = function () {

// 指定连接关闭后的回调函数

}

ws.onmessage = function () {

// 指定收到服务器数据后的回调函数

}

ws.onerror = function () {

// 指定报错时的回调函数

}

3. 发送数据

ws.send(message)  向服务器发送数据

4.关闭连接

ws.close()  关闭当前连接

使用场景 

  • 即时通讯
  • 在线游戏
  • 软件更新
  • 直播聊天
  • 社交订阅
  • 多人协同在线编辑

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT-- out of memory, returning null image

提示:本文为学习内容,若有错误,请及时联系作者,谦虚受教 文章目录 前言一、崩溃信息二、错误原因1.QImage2.QStandardItemModel 三、问题解决总结 前言 学如逆水行舟,不进则退。 一、崩溃信息 崩溃信息: QImage: out…

UIButton

titleEdgeInsets和imageEdgeInsets titleEdgeInsets和imageEdgeInsets的作用是用来移动btn两个子空间的排布的 它们只是image和label相较于原来位置的偏移量,那什么是原来的位置呢?其实就是不设置Insets的那个状态。下面为不设置insets的状态。 默认情…

AGMZE-A-32/100、AGMZE-A-10/350比例溢流阀控制器

AGMZO-A-10/315、AGMZO-A-20/210、AGMZO-A-32/100、AGMZO-A-10/50、AGMZO-A-20/350、AGMZE-A-10/50、AGMZE-A-20/210、AGMZE-A-32/100、AGMZE-A-10/350、AGMZE-A-20/50锥阀型,先导式,数字型比例溢流阀,用于压力开环控制。 A型,与…

风格迁移常用代码

nn.MSELoss均方损失函数 LPIPS感知损失 学习感知图像块相似度(Learned Perceptual Image Patch Similarity, LPIPS)也称为“感知损失”(perceptual loss),用于度量两张图像之间的差别,来源于论文《The Unreasonable Effectiveness of Deep Features as …

C# Dictionary类,确实有点东西

前言: 今天这篇文章是对Dictionary类的学习,Dictionary类是一个字典序,我们在编程中经常用到,它算是enum枚举类型和list类型的结合,是以键值对的形式去存储值的,那么你会这个知识点不,不会那么…

csapp datalab

知识点总结 1. 逻辑运算符关系 and(与)、or(或)和xor(异或)是逻辑运算符,用于对布尔值进行操作。它们可以在不同的逻辑表达式之间进行转换。下面是and、or和xor之间的转换规则: a…

答题小程序源码个人每日答题怎么做

答题小程序源码之个人每日答题怎么做 该模式以个人学习答题的方式进行答题,每人每天有X次答题机会,答对一题得X分,连续答对有额外奖励积分,每道题有倒计时X秒的思考时间。答题完成后领取本次的奖励积分。答题过程中如发现题目或答…

美图自研视觉大模型3.0发布

美图公司在举办的15周年生日会上发布了自研AI视觉大模型Miracle Vision3.0版本。面世100天后,美图AI视觉大模型MiracleVision3.0将全面应用于美图旗下影像与设计产品,并将助力电商、广告、游戏、动漫、影视五大行业。 美图公司创始人、董事长兼首席执行官…

3.后来居上的栈

概述 目标: 栈存储结构与特点基于数组实现栈基于单链表实现栈刷题(有效的括号) 存储结构与特点 栈(Stack)并非指某种特定的数据结构,它是有着相同典型特征的一数据结构的统称,因为栈可以用数组实现,也可以用链表实现&#xff…

超详细的万字Git分支教程(保姆级别)

💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…

stable-diffusion的模型简介和下载使用

前言 我们下载完stable-diffusion-ui后还需要下载需要的大模型,才能进行AI绘画的操作。秋叶的stable-diffusion-ui整合包内,包含了anything-v5-PrtRE.safetensors和Stable Diffusion-V1.5-final-prune_v1.0.ckpt两个模型。 anything-v5-PrtRE.safetenso…

PowerShell系列(十三):PowerShell Cmdlet高级参数介绍(三)

目录 1、WarningAction参数 2、WarningVariable 出现警告后的变量 3、Whatif 假设参数 4、Confirm参数 今天给大家讲解PowerShell Cmdlet高级参数第三部分相关的知识,希望对大家学习PowerShell能有所帮助! 1、WarningAction参数 通过单词含义&…

IG-Net:一种用于地铁客流预测的交互图网络模型

文章信息 论文题目为《IG-Net: An Interaction Graph Network Model for Metro Passenger Flow Forecasting》的一篇2023年4月发表在IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS的地铁客流预测交互图网络模型。 摘要 城市轨道交通系统很大程度上满足了市民的出行…

C++标准模板(STL)- 类型支持 (复合类型类别,is_scalar,is_object)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

后门分析及示例

代码分析&#xff0c;关键字定位 传一个asp文件 输入账户错误会提示&#xff1a;非法登录&#xff1b; 逆向工程抓取这个关键字定位 查找代码里面的关键字&#xff0c;定位到关键字后把代码复制出来&#xff0c; 修改exec执行函数为msgbox消息弹出用gb2312方式保存成VBS文件.…

Leetcode刷题详解——不同路径 II

1. 题目链接&#xff1a;63. 不同路径 II 2. 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finis…

企业链表(未完成)

文章目录 1. 插入2. 代码实现 1. 插入 // 插入 void insert(LinkList* list, int pos, LinkNode* data) {if (!list || !data)return;if (pos < 0 || pos > list->size)return;LinkNode* curNode &(list->head);for (int i 0; i < pos; i) {curNode curN…

jenkins工具系列 —— 删除Jenkins JOB后清理workspace

文章目录 问题现象分析解决思路脚本实现问题现象分析 Jenkins使用过程中,占用空间最大的两个位置: 1 、workspace: 工作空间,可以随便删除,删除后再次构建时间可能会比较长,因为要重新获取一些资源。 2 、job: 存放的是项目的配置、构建结果、日志等。不建议手动删除,…

任正非说:浑水摸鱼,只有强者才能摸到鱼。

嗨&#xff0c;你好&#xff01;这是华研荟【任正非说】系列的第24篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、只强调精细化管理&#xff0c;公司是会萎缩的&#xff0c;精细化管理的目的&#xff0c;是为了扩张不陷入混…

最新版上门服务小程序源码 同城技师上门服务系统源码

最新版上门服务小程序源码 同城技师上门服务系统源码 需要了解的请看文末 系统介绍&#xff1a; 1、数据概况&#xff08;新增业务城市用户投票功能&#xff0c;更加直观的查看业务城市的关注度、人气和影响力,促进业务开展&#xff09; 2、数据概况 &#xff08;增加可视化…