WebRTC建立P2P连接后怎么传自定义数据?
我用WebRTC搞了个简单的P2P连接,信令服务器也搭好了,双方能成功交换offer/answer和ICE候选者。但连上之后想发点自定义消息(比如聊天文本),发现不知道该调哪个API。试过peerConnection.send(),结果报错说不是函数。
查文档看到好像要用RTCDataChannel,但不确定是不是必须在创建offer前就建好?我现在的代码是在连接建立后再尝试创建data channel,结果对方收不到。下面是我创建channel的部分:
const pc = new RTCPeerConnection(config);
const channel = pc.createDataChannel('chat', { reliable: true });
channel.onopen = () => {
channel.send('hello');
};
channel.onmessage = e => console.log(e.data);
核心问题: data channel必须在创建offer之前就创建好,这样它的描述才会自动包含在SDP里。对端收到offer后,要通过ondatachannel事件来接收这个channel,然后才能正常通信。
你的代码只展示了创建data channel的部分,但关键是你创建完channel后有没有把它包含进offer里。正确的流程是这样的:
发起端(你):
对端:
几个点注意一下:
1.
ordered: true比reliable: true更标准可靠,reliable在有些浏览器已经废弃了2. 你的代码里peerConnection.send()报错是正常的,RTCPeerConnection本身没有send方法,send是data channel的方法
3. ICE候选者的交换同样重要,别忘了在pc.onicecandidate里把候选者发给对端并及时添加
4. 安全方面:data channel本身不加密,如果传输敏感数据需要确保底层SRTP通道已加密(WebRTC默认走DTLS),或者应用层自己加密
你可以检查一下对端有没有监听ondatachannel,这个事件没注册的话,对端根本收不到channel。