WebRTC 客户端状态机

WebRTC 客户端状态机

  • WebRTC 客户端状态机
    • 客户端状态机
    • 客户端加入流程图
    • 客户端离开流程图
    • 端到端连接的基本流程

WebRTC 客户端状态机

客户端状态机

首先我们来看一下客户端的一个状态机,客户端与服务器直接通过信令的一个交互之后自然而然的形成一个状态机:

在这里插入图片描述

最开始的时候状态机是处于初始化状态的,当用户发送了一个join到服务端之后服务端会给它回一个joined消息,客户端在收到joined消息之后就变成了加入状态(joined),这个时候用户是可以离开房间的。当客户端离开的时候会回到初始化或者是离开状态。

当一个用户A处于joined的状态的时候,另外一个用户B又进来了,这时用户A就会变成joined_conn状态,就是加入并且可以与对方进行通话的状态。其中用户A的变化就是通过other_join消息通知的,当他收到other_join的时候它就改变状态从joined到joined_conn,对于后加入的用户B,它还是处于joined这个状态,因为它自己并没有收到other_join这个消息,所以房间这两个人其实是两个不同的状态,用户A是先加入房间的,是joiner_conn状态 ,对于后加入的用户B是joined状态。对于join_conn这个状态的用户它也可离开,当他离开的时候它也处于初始化或者离开状态,这同joined状态的情况是一样的。

如果用户A需要离开房间,离开的时候它会发送一个bye消息给这个现在还在房间中用户B,用户B收到bye这个消息的时候状态变成joined_unbind,它虽然已经在这个房间内,但是由于另外一个用户已经走了,所以他们直接进行通讯的这个连接已经不需要了,那这个时候需要释放这个连接,所以要将peerconnection这个连接中的相应通道全部进行解绑,所以它就处于joined_unbind状态。

如果用户B这个时候处于joined_unbind状态,这时候又有一个新的用户C进入,那么用户B会变成joined_conn状态,而刚进来用户C变成joined的状态。用户B处于join_conn状态的时候,就是说这两个用户直接可以进行通讯了,那么这时候如果用户C在加入后离开了,用户B就回到这个joined_unbind状态。

如果处于joined_unbind状态,也可以离开,那这个时候是房间里一个人都没有了,那都处于初始化和离开状态。

有这样一个状态机之后,客户端与服务器之间就可以进行交互了,以上就是整个房间中各个用户状态的变化的一个状态机。

客户端加入流程图

在这里插入图片描述

首先获取这个音视频数据(本地),但如果不能获取到,那就直接失败了,本次通讯肯定不能完成了。

但是如果能获取到音视频数据(本地)的时候,就要拿到数据之后,再与这个信令服务器进行连接,然后注册相关的信令处理函数,也就是本机可以处理接收到的服务端信息,比如joined加入成功信息。

发送加入房间消息后的分支:

  1. 无论房间中是否有其他用户(或者房间已经满了),都会走这一步:如果有一个用户A加入的房间,那么他首先要设置状态,说我现在已经处于加入的状态,这时候它要创建并绑定媒体流PeerConnection,创建一个我们最终通讯的通道,并且将媒体流绑定,这是用户加入的情况。
  2. 如果房间中原本有另外一个用户B,那B要判断现在的状态,如果他现在是一个未绑定状态,他要创建PeerConnection,可能就要跟对方A进行通讯,并且绑定这个他本地的媒体流到这个PeerConnection后面才能进入相应通讯。如果不是这种状态,B是一个joined状态,那这时B就变成了这个join_conn,说明在这之前它已经创建过PeerConnection,并绑定过本地音视频媒体流了,之后所以就不需要绑定,这时候他只要改变状态,变成了join_conn状态,然后变成join_conn状态之后就开始媒体协商,然后收集这个candidate进行连接性检测,最终传输。
  3. 最后一个分支,就是当这个房间满了,用户C来了(经过分支一)发现房间满了,这时候将C设成离开的状态,并关闭与服务端的连接。注意:因为如果返回full房间满状态,是不会去走分支一的,所以不会去创建peerConnection连接和localStream数据,所以不需要去释放。

客户端离开流程图

在这里插入图片描述

另外还有leave消息,当离开的时候把它分成两种:

  1. 本地自己发送离开消息:先走中间的分支,关闭掉自己的peerconnection,关闭音视频设备(媒体流),然后等待收到服务器端确认已离开的消息,那这时就变成了leaved初始状态,这时候关闭连接就好了。
  2. 对端离开后,对方发送bye消息到本地的时候,本地状态就变成了join_unbind状态,同样也要关闭对应的peerconnection。关闭之后其他用户再加入的时候,当本机收到other_join消息的时候又会重新创建PeerConnection并进行绑定。

端到端连接的基本流程

在这里插入图片描述

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

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

相关文章

读天才与算法:人脑与AI的数学思维笔记23_人工智能讲故事

1. 伟大的自动语法分析器 1.1. 思维呆板机械的阿道夫奈普(Adolphe Knipe)一直想成为一名作家,可是他写出来的东西既迂腐又无趣 1.2. 后来,灵光乍现,他得到了一个启示:语言遵循语法规则,这规则…

【连连国际注册_登录安全分析报告】

连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…

OPC :快速上手

本系列为OPC技术的快速上以及持续研究和技术实战专栏,将不定期更新。 本章节提供OPC系列技术博文的快速导航。 《OPC服务器简介和入门介绍》 《物联网平台如何为OPC服务器创造新生命力》 《OPC服务器开发之WtOPCSvr——开发文档(1)》 《OPC服…

何为基差?股指期货的升水和贴水又怎么理解?

基差是一个金融术语,它指的是现货价格和期货价格之间的差额。在股指期货市场中,现货就是指实际的股票指数,而期货则是基于这个指数未来某个时间点的价格预期。基差可以是正的或负的,具体取决于期货价格是高于还是低于现货价格。 1…

每日一题7:Pandas-重命名列

一、每日一题 编写一个解决方案,按以下方式重命名列: id 重命名为 student_idfirst 重命名为 first_namelast 重命名为 last_nameage 重命名为 age_in_years 返回结果格式如下示例所示。 解答: import pandas as pddef renameColumns(studen…

《2024年AI安全报告》:AIML工具使用量飙升594.82%

人工智能(AI)不仅仅是一种开拓性的创新技术,甚至已经成为一种常态,企业正在工程、IT营销、财务、客户服务等领域迅速采用AI和机器学习(ML)工具。但与此同时,他们必须平衡AI工具带来的诸多风险&a…

ESP32引脚入门指南(三):从理论到实践(Touch Pin)

引言 ESP32作为物联网领域的明星微控制器,不仅以其强大的网络通信能力著称,还内置了丰富的外设资源,其中就包括电容式触摸传感(Capacitive Touch)功能。本文旨在深入浅出地介绍ESP32的Touch引脚,带你了解其…

15-LINUX--线程的创建与同步

一.线程 1.线程的概念 线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程。 2.线程的三种实现方式 ◼ 内核级线程:由内核创建,创建开销大,内核能感知到线程的存在 ◼ 用户级线程:线程的创建有用户空…

刷题第3天(简单题):LeetCode206--反转链表--双指针法

LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例…

五一超级课堂---Llama3-Tutorial(Llama 3 超级课堂)---第三节llama 3图片理解能力微调(xtuner+llava版)

课程文档: https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频: https://space.bilibili.com/3546636263360696/channel/collectiondetail?sid2892740&spm_id_from333.788.0.0 操作平台: https://studio.intern-ai.org.cn/consol…

自动镭雕机价格是多少?

自动镭雕机是一种高精度、高效率的激光雕刻设备,广泛应用于手机、电脑、玻璃等产品表面的图案雕刻。那么,自动镭雕机多少钱一台呢?本文将为您详细解析各种因素对自动镭雕机价格的影响。 一、影响自动镭雕机价格的因素 1. 品牌和质量 自动镭…

xiuno(修罗)知乎模板二开优化魔板仿网盘资源社–模板加全套插件

使用说明 以服务器为例搭建教程 ①先安装 PHP7.1 版本 再安装数据库 Mysql ②解压文件:xiunobbs_4.0.4(解压到根目录).zip ③解压②完成后找到【plugin】文件夹再解压:plugin(解压到 plugin 文件夹).zip 设置伪静态代码在上面&am…

知从科技应邀参加恩智浦技术日巡回研讨会郑州站汽车电子专场

4月18日,恩智浦技术日巡回研讨会的首个汽车电子专场在郑州成功举办。此次研讨会汇聚了众多行业专家,聚焦前沿的赋能技术,共同探讨汽车电子架构、ADAS、汽车电气化、车载信息娱乐系统、UWB超宽带等热门应用。作为恩智浦合作伙伴,知…

【python量化交易】qteasy使用教程05——创建第一个自定义交易策略

创建第一个自定义交易策略 使用qteasy创建自定义交易策略开始前的准备工作本节的目标自定义策略的实现方法使用 qteasy 的 Strategy 策略类三种不同的自定义策略基类定义一个双均线择时交易策略定义策略运行时机定义策略需要的数据自定义交易策略的实现:realize()获…

Gitee 码云与Git 交互

优质博文:IT-BLOG-CN 一、进入码云官方网站,注册用户 码云(Gitee.com)是一个类似于GitHub的在线代码托管平台。 码云提供了包括版本控制、代码托管、协作开发和代码分享等功能,基于Git开发,支持代码在线查看、历史版本查看、Fo…

回归的无分布预测推理

摘要 我们利用保形推理,开发了回归中无分布预测推理的一般框架。所提出的方法允许使用回归函数的任何估计量构建响应变量的预测带。所得的预测带在标准假设下保留了原始估计量的一致性,同时保证了有限样本边际覆盖,即使这些假设不成立。我们…

echarts-gl 离线3D地图

1、安装依赖 echarts-gl 与 echarts 版本关系: "echarts": "^5.2.0", "echarts-gl": "^2.0.8"# 执行安装 yarn add echarts-gl2、下载离线地图 免费下载实时更新的geoJson数据、行政区划边界数据、区划边界坐标集合_…

容器化Jenkins远程发布java应用(方式二:自定义镜像仓库远程拉取构建)

1.创建maven项目 2.配置git、maven 3.阿里控制台>容器镜像服务>镜像仓库>创建镜像仓库 4.执行shell脚本(推送镜像到阿里云镜像仓库) 使用到登录阿里云仓库命令 #!/bin/bash # 服务名称 SERVER_NAMEplanetflix-app # 镜像tag IMAGE_TAG1.0.0-SN…

亚马逊云科技中国峰会:与你开启云计算与前沿技术的探索之旅

亚马逊云科技中国峰会:与你开启云计算与前沿技术的探索之旅 Hello,我是科技博主Maynor,非常高兴地向你们推荐亚马逊云科技中国峰会,这是一场将于 5 月 29 日至 30 日在上海世博中心举办的科技盛会,如果你对云计算、行业发展新趋势…

Android Studio高版本安卓模拟器抓取https包

Android Studio avd 设置 证书生成 *.cer格式证书​ openssl x509 -inform DER -subject\_hash\_old -in charles-ssl-proxying-certificate.cer​ *.pem格式证书​ openssl x509 -inform PEM -subject\_hash\_old -in charles-ssl-proxying-certificate.pem会输出 2cb30a9e …