我们青龙流式系统的数据通道RTCDataChannel
是专门用来传输除音视频数据之外的任何数据的,如短消息、实时文字聊天、文件传输、远程桌面、游戏控制、P2P加速等;当然像是文本聊天、文件传输也可以通过服务器中转
的方式实现,但青龙流式系统则是优先使用P2P
方案,即两端之间直接传输数据,可以减小服务端压力,当然webRTC也是可以采用中继的方案;
RTCDataChannel 的主要特点:
- 低延迟:直接点对点通信可确保将延迟降至最低。
- 可靠和不可靠模式:允许可靠(类似 TCP)和不可靠(类似 UDP)数据传输。
- 二进制和文本数据:支持发送和接收二进制数据和文本数据。
- 灵活的使用案例:适用于各种应用,包括文件传输、游戏、消息传递和实时协作应用。
API说明
localConnection = new RTCPeerConnection();
sendChannel = localConnection.createDataChannel("sendChannel");
sendChannel.onopen = handleSendChannelStatusChange;
sendChannel.onclose = handleSendChannelStatusChange;
数据通道可以配置在不同模式中,一种是使用重传机制的可靠传输模式(默认模式),可以确保数据成功传输到对等端;另一种是不可靠传输模式,该模式下可以通过设置maxRetransmits
指定最大传输次数,或通过maxPacketLife设置传输间隔时间实现;这两种配置项是互斥的,不可同时设置,当同为null时使用可靠传输模式,有一个值不为null时开启不可靠传输模式
createDataChannel方法允许传入第二个参数进行不同的配置
- reliable 设置消息传递是否进行担保
- ordered 用来设置消息的接受是否需要按照发送时的顺序
- maxRetransmitTime 设置消息发送失败时,多久重新发送
- maxRetransmits 设置消息发送失败时,最多重发次数
- protocol 设置强制使用其他子协议,但当用户代理不支持该协议时会报错
- negotiated 此选项用来设置开发人员是否有责任在两边创建数据通道,还是浏览器来自动完成这个步骤
- id 这个用来设置通道的唯一标识,可以在多通道时进行区分
这些配置项很多,不过大部分只在高级应用中才会使用。主要使用的配置项是reliable和 ordered,当设置为true时数据通道表现得更像TCP,设置为False时表现得更像UDP。
多个数据通道的对应关系
- 如果发起端创建了多个数据通道,接收端会为每个数据通道触发一次dataChannel事件,接收端为了区分数据通道与发送端一一对应,需要利用
Protocol
进行区分,protocol
表示自协议的名称,可以是任意字符串,这样接收端在每个dataChannel事件中获取到发起端的protocol后就可以与发起端一一对应了 - binaryType可以指定
BloB类型
或ArrayBuffer类型
,可以使用数据通道传输二进制数据或其他字符串数据,可以利用传输字符串来在传输文件前将文件信息等元数据发送给接收端 - bufferedAmountLowThreshold属性,该属性对缓存区设置了一条“水位线”,解决了
数据通道不支持设置缓存大小的问题
,当缓冲区从高水位降到设置的水位线时会触发bufferedamountlow
事件,当降低到设置值以下时再次调用send()
方法发送数据
实现文本消息的关键过程
- 需要创建的对象与通道
- 本地连接对象:localConnection
- 远端连接对象:remoteConnection
- 发送通道:sendChannel
- 接收通道:receiveChannel
- 实例化本地发送数据通道,指定通道ID,添加onopen和onclose事件
sendChannel = localConnection.createDataChannel("webrtc-datachannel") //指定通道ID为’webrtc-dataChannel‘
sendChannel.onopen = {}
sendChannel.onclose = {}
- 远端连接里添加ondatachannel事件,对应事件里的回参event.channel对象即为接收端数据通道,然后在该对象上添加onmessage事件,用于接受发送端发送过来的文本消息
remoteConnection.ondatachannel = (event) => {
receiveChannel = event.channel; //接收消息事件监听
receiveChannel.onmessage = (event) => {
//消息event.data
};
receiveChannel.onopen = {
// ...
};
receiveChannel.onclose = {
// ...
};
};
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/6548