我正在尝试编写WebRTC的基本实现,以使用RTCDataChannel
发送文本数据。我的信号系统工作正常。在两个对等体上都设置LocalDescription和RemoteDescription,并且icecandidate事件正确触发,并且ice候选者被共享给两个对等体。DataChannel onopen
事件也被激发。但是,当我尝试使用RTCDataChannel的send()
函数发送消息时,onmessage
事件不会在其他对等体上触发。
我是这样打开数据通道的-
private openDataChannel() {
this.dataChannel = this.peerConnection.createDataChannel(`myDataChannel_${this.username}`, { ordered: true, protocol: 'tcp', });
this.dataChannel.onerror = error => console.log('Data Channel Error:', error);
this.dataChannel.onmessage = message => {
console.log('data channel message', message);
this.messages.push(message.data);
};
this.dataChannel.onopen = event => console.log('data channel opened', event);
}
我正在使用this.dataChannel.send(this.msgToSend);
发送数据
这是我创建RTCPeerConnection的部分-
this.peerConnection = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.stunprotocol.org:3478' }]
});
console.log('RTCPeerConnection created');
console.log(this.peerConnection);
this.peerConnection.onicecandidate = event => {
if (event.candidate) {
console.log('onicecandidate', event)
this.sendToServer({
type: 'candidate',
candidate: event.candidate
})
}
}
this.openDataChannel();
在创建RTCPeerConnection
并调用this.openDataChannel
之后,我调用信令服务器,通过该服务器在两个对等端上设置remoteDescription和localDescription。
我尝试使用chrome://webrtc-internals/进行调试。在其中,我可以看到两个对等体上的两个数据通道。我可以看到messagesReceived count在每次我从其他对等端发送数据时递增。但是,在js上,onmessage
事件没有触发x1c 0d1x
这里我怀疑的是,我通过myDataChannel_B从 peer B 发送数据(因为这是在那里创建的数据通道)。在 * 对等端A*webrtc-internals显示myDataChannel_B下的messagesReceived count。但是,在对等体A上,我订阅了myDataChannel_A的onmessage
事件。这似乎很奇怪。我做错了什么?
1条答案
按热度按时间cnwbcb6i1#
我也遇到了这个完全相同的问题,结果发现我在连接的每一边都创建了一个单独的数据通道。
如createDataChannel示例中所述,如果您试图通过连接的任一端创建数据通道,则它们将需要具有共享的
id
值,例如0
:值得注意的是,
ondatachannel
回调或datachannel
事件仅在 * 远程对等点 * 创建数据通道时触发,而不是在本地创建通道时触发。当negotiated
设置为true时,不会触发ondatachannel
事件。请参阅datachannel event了解更多详细信息。如果成功,查看chrome://webrtc-internals/应该只显示一个RTCDataChannel。