websocket WebRTC - RTCDataChannel的onmessage事件未触发

fgw7neuy  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(289)

我正在尝试编写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事件。这似乎很奇怪。我做错了什么?

cnwbcb6i

cnwbcb6i1#

我也遇到了这个完全相同的问题,结果发现我在连接的每一边都创建了一个单独的数据通道。
如createDataChannel示例中所述,如果您试图通过连接的任一端创建数据通道,则它们将需要具有共享的id值,例如0

// Both sides
const pc = new RTCPeerConnection(options);
const channel = pc.createDataChannel("chat", { negotiated: true, id: 0 });

值得注意的是,ondatachannel回调或datachannel事件仅在 * 远程对等点 * 创建数据通道时触发,而不是在本地创建通道时触发。当negotiated设置为true时,不会触发ondatachannel事件。请参阅datachannel event了解更多详细信息。
如果成功,查看chrome://webrtc-internals/应该只显示一个RTCDataChannel

相关问题