一个
RTCPeerConnection
实例运行应用程序与另一个浏览器的RTCPeerConnection
(或者另一个实现了该协议的端点)建立点对点连接。通信是通过在信令通道上交换控制消息(称为信令协议)来协调的,信令通道需要服务器提供(协议中并未特殊规定),例如使用XMLHttpRequest
或Web Sockets。
RTCConfiguration
定义了一组参数,用于配置如何建立或重新建立通过
RTCPeerConnection
建立的对等通信。
RTCIceServer
用于描述ICE代理可以用来建立与对等点连接的 STUN 和 TURN 服务器。
RTCSignalingState
信令状态
stable:offer/answer交换进程还没有执行,仅仅是初始化状态,local 和 remote 的
desc
都为空。have-local-offer:local 成功应用 type 为 offer 的
desc
const offerOptions = { offerToReceiveAudio: 1, offerToReceiveVideo: 1 }; // 创建type为offer的desc const offerDesc = localRTCPeerConnection.createOffer(offerOptions); // 本地连接 localRTCPeerConnection.setLocalDescription(offerDesc);
have-remote-offer:remote 成功应用 type 为offer 的
desc
// 远程连接 remoteRTCPeerConnection.setRemoteDescription(offerDesc);
have-local-pranswer:remote 成功应用 type 为offer的
desc
(上面程序的最后一行) ,并且 local的 type 为 pranswer 的desc
被成功应用。const answerDesc = await remoteRTCPeerConnection.createAnswer(); remoteRTCPeerConnection.setLocalDescription(answerDesc);
have-remote-pranswer:local 的 type 为 pranswer 的
desc
被成功应用(上面程序的最后一行),并且remote 的 pranswer 也被成功应用。localRTCPeerConnection.setRemoteDescription(answerDesc);
closed:RTCPeerConnection 关闭。
localRTCPeerConnection.close(); remoteRTCPeerConnection.close();
一个简单的转换集可能是:
Caller transition:
new RTCPeerConnection(): stable
setLocalDescription(offer): have-local-offer
setRemoteDescription(pranswer): have-remote-pranswer
setRemoteDescription(answer): stable
Callee transition:
new RTCPeerConnection(): stable
setRemoteDescription(offer): have-remote-offer
setLocalDescription(pranswer): have-local-pranswer
setLocalDescription(answer): stable
这可能与之前的描述有点不符,可我查阅到的文档确实是这样写的;我想 stable 应该是代表稳定的状态,并且我并没有找到创建 type 为 pranswer的方法,我希望你知道这些,并形成自己的判断。
调用 new RTCPeerConnection(configuration)
, 创建一个RTCPeerConnection
对象。
configuration.servers
包含用于查找和访问ICE使用的服务器的信息。应用程序可以提供每种类型的多个服务器,任何TRUN服务器也可以用作STUN服务器,用于收集服务器自反候选服务器(这句话我也不太理解…)。
一个RTCPeerConnection
对象拥有一个 signaling state,一个connection state,一个ICE gathering state,和一个ICE connection state。当对象被创建时,这些都将初始化。
RTCPeerConnection
的ICE协议实现由ICE代理表示。某些RTCPeerConnection
方法涉及与ICE代理的交互,即addIceCandidate
、setConfiguration
、setLocalDescription
、setRemoteDescription
和close
。
RTCSdpType
该枚举对象描述了 RTCSessionDescriptionInit
或者RTCSessionDescription
实例的类型。
desc
必须被作为 SDP offer 对待。desc
必须被作为SDP answer对待,但不是最终的answer。 用作SDP pranswer的desc
可以应用于对SDP offer 的响应,或对先前发送的SDP pranswer的更新。desc
必须被作为最终的answer 对待。offer-answer 交互必须被认为是完整的。作为SDP answer的desc
被用于响应 SDP offer或者作为更新之前发送的 SDP pranswer。RTCSessionDescription 类
该类被用于RTCPeerConnection
暴露local和remote 的 session descriptions
; 值得一提的是,该类包含了一个toJSON()
方法,这可在信令服务器要求传输该对象时使用。
点对点连接远远不止上面所写的内容,还有许多高级的特性,我没有写到,但灵活运用上面的知识已经能够创建基于WebRTC协议的对等连接了。
推荐博文
https://github.com/webrtc/samples WebRTC demo
参考博文
https://w3c.github.io/webrtc-pc/#peer-to-peer-connections 官方文档
文章浏览阅读9.4k次,点赞24次,收藏20次。深入浅出系列书籍是由O’Reilly出版社发行的一系列教育书籍,它强调以特殊的方式排版,由大量的图片和有趣的内容组合构成,而达到非疲劳的沉浸式学习效果。整理了一部分Head First书籍,有需要的朋友可以自行下载1、O’Reilly:Head First设计模式《O’Reilly:Head First设计模式》趋近完美,因为它在提供专业知识的同时,仍然具有相当高的可读性。本书共有14章,每..._head first 系列
文章浏览阅读4.1k次。在RTX2060显卡的机器上,编译了opencv4.4,报错如下:classes, confidences, boxes = net.detect(image, confThreshold, nmsThreshold)cv2.error: OpenCV(4.4.0) /home/ycc/opencv-4.4.0/modules/dnn/src/dnn.cpp:2353: error: (-216:No CUDA support) OpenCV was not built to work with th_cuda_arch_ptx
文章浏览阅读460次。错误提示:没有定义这个personService bean 可能是这个bean打错了org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'personService' is defined_关于bean的命名规则下面说法错误的是 bean name 可以通过
文章浏览阅读5.8k次,点赞2次,收藏17次。UART简介1) UART简介UART(Universal Asynchronous Receiver Transmitter),即通用异步(收发双发时钟不同步)收发器,是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。2) 并行与串行通信总线的本质就是导线,总线的作用是在计算机不同部件间传递一些信息,总线传递的本质就是一些高低电平的信号,比如用高电平信号代表1,低电平信号代表0。所谓并行通信指总线在传递信号的时候把数据_uart
文章浏览阅读657次。在恶意流量种类的选择方面,经过特征选择,最终得到某种恶意流量的特征存在于负载当中,其中包含一些恶意的网站等,接收到这种恶意流量后会被感染,并变成恶意流量发送端。基于此,采用更换负载内容以达到增加恶意流量数据的目的。使用scapy库进行对数据包的解析,以及希望通过更改负载内容从而生成新的恶意流量数据。_scapy 恶意流量转化为图像
文章浏览阅读4.2k次,点赞2次,收藏25次。公司间采购订单的退货以及免费项目两种特殊的公司间采购订单业务:公司间采购订单退货:有正常的业务就会有退货业务; 公司间免费的采购订单:譬如A公司的废料可能无偿调拨给集团下另外一家公司。1.公司间采购订单退货在正常的公司间采购订单的配置基础上,只需要增加一个配置:分配退货的发货单类型NCR给相应的采购订单类型和交货工厂(供应商对应的工厂)。配置路径:OLME>Purchase order>Return Order>Store Return/Return Plant to _sap 公司间转储 免费
文章浏览阅读1.6k次。说白了就是做软件,国内外有各种GIS软件公司,例如美国的ESRI公司的arcgis,国产的超图的supermap和中地数码的mapgis等,都属于gis软件。软件开发又分为应用层和底层,通常会用到c语言或c++,企业会招聘C++工程师来从事这部分工作。需要这类开发人员掌握基本的数据结构和算法以及相关开发经验。_qianduan gis技术
文章浏览阅读2.5k次。项目是使用了husky,在使用git comit的时候,会调用pre-commit的node代码,这里找不到对应的node环境变量,所以报错了。,换一个有配置husky的项目,执行git commit 发现一样的结果,这又排除了是项目的配置被人修改导致的问题。,使用git BASH命令行工具来执行git commit,结果还是一样,这说明不是vscode的问题。可以看到版本号,这就说明,node的环境变量配置并没有问题。这比肯德基疯狂星期四还离谱好不!把那个分号去掉,试了一下,就可以了!..._git提交报错:'"node"' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 hu
文章浏览阅读1.9k次。HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非_hpsocket udpcast udpnode
文章浏览阅读650次。日前,ZStack Cloud v4.0发布,相信大家看了都有一种焕然一新的感觉,本轮发布最大的变化是 UI 端进行了完全的重写,技术栈由原来的 Vue 体系升级到 React,其中采用了一些全新的技术,如 UMI、GraphQL、微前端、低代码开发等,接下来,我们一起来探秘ZStack Cloud v4.0 漂亮 UI 的技术原理,本文将为您解读:低代码开发。一、为何要引入低代码开发?在新版 UI 中,所有列表页、权限控制、主题外观、界面文字都不是由前端开发人员手动编写的,而是借助低代码开发平台根据响
文章浏览阅读1.7w次,点赞10次,收藏18次。通过PdfPCell的方法可以隐藏单元格的边框。//新建单元格对象PdfPCell cell = new PdfPCell(new Phrase("test"));//隐藏上边框// cell.disableBorderSide(1);//隐藏下边框// cell.disableBorderSide(2);//隐藏上、下边框//cell.disableBorderSide(3..._itext实现表格边框
文章浏览阅读528次。在数据仓库领域有一个概念叫conceptual data model,中文一般翻译为“概念数据模型”。 概念数据模型是最终用户对数据存储的看法,反映了最终用户综合性的信息需求,它以数据类的方式描述企业级的数据需求,数据类代表了在业务环境中自然聚集成的几个主要类别数据。 概念数据模型的内容包括重要的实体及实体之间的关系。在概念数据模型中不包括实体的属性,也不用定义实体的主键。这是概..._逻辑数据模型转为物理数据模型时没有dbm