当前位置: 首页 > news >正文

webrtc的RTCPeerConnection使用

背景:

平时我们很少会需要使用到点对点单独的通讯,即p2p,一般都是点对服务端通讯,但p2p也有自己的好处,即通讯不经过服务端,从服务端角度这个省了带宽和压力,从客户端角度,通讯是安全,且快速的,当然有些情况下可能速度并不一定快。那么如何实现p2p呢?

解决办法:

webrtc的RTCPeerConnection就实现了p2p的功能,使用RTCPeerConnection需要理解一些概念,什么是信令,信令交换的过程,信令服务器。

信令

2个设备需要通讯,就需要知道对方的在互联网上的公开地址,一般情况下2个设备都是不会直接拥有一个公网的ip地址,所以他们之间的通讯,就需要如何在公网找到自己的方式,路由信息告诉对方,通常这个信息都是临时的,并非永久,当对方获取到这个信息后,就可以通过网络找到彼此的实际路由路径,从而进行通讯,这个信息就是信令(位置信息)。

信令的交换过程:

假设2个设备,p1要和p2进行通讯

1.p1发起邀请阶段

const offer = await p1.createOffer();//创建邀请信令
await p1.setLocalDescription(offer);//设置为本地信令send(JSON.stringify(offer));//把邀请信令发送给对方,至于怎么发送,一般是需要一个第3方的信令服务器来转发这个信息

2.p2收到邀请阶段

 当收到p1发起的有邀请信令offer后

await p2.setRemoteDescription(new RTCSessionDescription(JSON.parse(offer)));//设置为远端的信令const answer = await p2.createAnswer();//创新一个应答信令,告诉p1我的位置
await pc.setLocalDescription(answer);//设置我的位置send(JSON.stringify(answer ));将位置信息发送给p1

3.p1收到应答信息阶段

await p2.setRemoteDescription(new RTCSessionDescription(JSON.parse(answer )));//设置为远端的信令
4.处理onicecandidate事件,确认要不要通讯
 await p2.addIceCandidate(new RTCIceCandidate(JSON.parse(candidate)));

完成上述几个阶段,正常来说就能开始通讯了

数据通讯DataChannel的使用

发送端

// 创建PeerConnection对象
const pc = new RTCPeerConnection();// 创建DataChannel
const dataChannel = pc.createDataChannel('myDataChannel');// 监听DataChannel的open事件
dataChannel.onopen = () => {console.log('DataChannel已打开');
};// 监听DataChannel的error事件
dataChannel.onerror = (error) => {console.error('DataChannel错误:', error);
};// 监听DataChannel的close事件
dataChannel.onclose = () => {console.log('DataChannel已关闭');
};// 发送文本消息
function sendMessage(message) {dataChannel.send(message);
}// 发起PeerConnection连接
// ...// 在某个事件触发时调用sendMessage()发送消息
// sendMessage('
http://www.lryc.cn/news/241475.html

相关文章:

  • 【视觉SLAM十四讲学习笔记】第三讲——Eigen库
  • Ubuntu开机显示recovering journal,进入emergency mode
  • C++_String增删查改模拟实现
  • LeeCode前端算法基础100题(2)- 最多水的容器
  • 排序算法--归并排序
  • 【LeetCode:1410. HTML 实体解析器 | 模拟+哈希表+字符串+库函数】
  • 基于SSM的公司仓库管理系统(有报告)。Javaee项目
  • spark数据倾斜的解决思路
  • Python武器库开发-前端篇之html概述(二十八)
  • 安防视频EasyCVR平台太阳能供电+4G摄像头视频监控方案的建设
  • 12.位运算的性质(异或的性质)
  • 国标直流充电枪9孔分别啥意思?
  • 关于 Google AMP 和 SEO
  • 【SpringMVC】 对请求的不同响应
  • SQL进阶学习
  • 邦芒解析:做好职场规划防止跳槽失败
  • 基于springboot实现实习管理系统的设计与实现项目【项目源码+论文说明】计算机毕业设计
  • 【华为OD题库-031】比赛的冠亚季军-java
  • 电脑如何禁止截屏
  • 【Web】NewStarCTF Week1 个人复现
  • Android 提示框代码 java语言
  • 【c语言】二维数组的对角线对称交换
  • Sulfo-CY3 NHS荧光染料的制备和表征
  • 数字乡村:科技赋能农村产业升级
  • K8S部署mongodb-sharded-cluster(7.0.2)副本分片
  • Dockerfile-CentOS7.9+Python3.11.2
  • 自定义责任链Filter实现
  • NX二次开发UF_CSYS_create_matrix 函数介绍
  • css引入的三种方式
  • 含羞草研究所研究含羞草的代码