「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
什么是 RTCDataChannel ?
RTCDataChannel 是一个双向数据通道的连接,可以通过其使得客户端与远端实现通信,通讯顾名思义,即可以接收信息也可以发送信息,下面让我们来看看,WebRTC 是如何通过 RTCDataChannel 通道进行信息传输的。
接收消失涉及到的api
RTCDataChannel.onmessage = function; RTCDataChannel 的 onmessage 事件处理器,用来接收远端发送的数据,实现数据接收。
接收信息代码
pc = new RTCPeerConnection(null);
pc.addEventListener("datachannel", this.datachannelHandle);
datachannelHandle = (event) => {
this.dataChannelInstance = event.channel;
this.dataChannelInstance.binaryType = "arraybuffer";
this.dataChannelInstance.addEventListener("message", this._messageHandle);
}
messageHandle = (event) => {
处理通过 DataChannel 接收的信息
}
发送信息涉及到的api
RTCDataChannel.send(data); RTCDataChannel 的
send()方法,通过 DataChannel 通道将数据发送到远端,实现信息发送。
发送信息代码
this.dataChannelInstance.send(data);
为什么选择使用 ProtoBuf 类型数据进行传输
- ProtoBuf 是 Google 出品的,是二进制类型,传输速度要快于 json,且有数据表明,用 ProtoBuf 序列化后的数据大小是 json 的10分之1,是 xml 格式的20分之1,类似于 xml ,但是大小比较上,xml 是 ProtoBuf 的 3-10倍,传输速度上是 ProtoBuf 比 xml 快 20-100倍。也就是数据大小小,传输性能快。
- ProtoBuf 无语言、平台的限制。 3.扩展、兼容性好。
综上所述,如果考虑到数据的结构化,可以选择 json、xml;如果考虑到传输效率,则可选择 ProtoBuf。
ProtoBuf 协议是使用时内部自己定义的,无统一标准,我们使用的 ProtoBuf 有以下几部分组成: 1.协议头(固定长度和内容); 2.ProtoBuf 总长度(固定长度,内容不固定,1、2、3、4的总长度); 3.协议类型(固定长度,内容不固定,例如input类型是 6 0 0 0,输入法类型是 6 1 0 0,在固定位置使用不同类型,以此来区分是什么消息); 4.协议内容(传输的内容,长度、内容均不固定)。