Javascript 使用webRTC在两个对等方之间创建和使用数据通道
我正在尝试使用WebRTC设置点对点文件共享系统。我可以在每一侧打开一个数据通道,但我不能从一个用户向另一个用户发送消息。此外,如果一个对等方关闭通道,另一个对等方关闭通道,则仅为该用户触发onclose事件 通过webRTC设置和使用数据通道的正确方法是什么 你能告诉我我的代码有什么错误或遗漏吗Javascript 使用webRTC在两个对等方之间创建和使用数据通道,javascript,webrtc,real-time,rtcdatachannel,Javascript,Webrtc,Real Time,Rtcdatachannel,我正在尝试使用WebRTC设置点对点文件共享系统。我可以在每一侧打开一个数据通道,但我不能从一个用户向另一个用户发送消息。此外,如果一个对等方关闭通道,另一个对等方关闭通道,则仅为该用户触发onclose事件 通过webRTC设置和使用数据通道的正确方法是什么 你能告诉我我的代码有什么错误或遗漏吗 //create RTC peer objet. var RTCPeerConnection = webkitRTCPeerConnection; var RTCIceCandidate = wind
//create RTC peer objet.
var RTCPeerConnection = webkitRTCPeerConnection;
var RTCIceCandidate = window.RTCIceCandidate;
var RTCSessionDescription = window.RTCSessionDescription;
var iceServers = {
iceServers: [{
url: 'stun:stun.l.google.com:19302'
}]
};
var p2p_connection = new RTCPeerConnection({
iceServers: [
{ 'url': (IS_CHROME ? 'stun:stun.l.google.com:19302' : 'stun:23.21.150.121') }
]
});
// send offer (only executes in one browser)
function initiateConnection() {
p2p_connection.createOffer(function (description) {
p2p_connection.setLocalDescription(description);
server_socket.emit('p2p request', description,my_username);
});
};
// receive offer and send answer
server_socket.on('p2p request', function(description,sender){
console.log('received p2p request');
p2p_connection.setRemoteDescription(new RTCSessionDescription(description));
p2p_connection.createAnswer(function (description) {
p2p_connection.setLocalDescription(description);
server_socket.emit('p2p reply', description,sender);
});
});
// receive answer
server_socket.on('p2p reply', function(description,sender){
console.log('received p2p reply');
p2p_connection.setRemoteDescription(new RTCSessionDescription(description));
});
// ICE candidates
p2p_connection.onicecandidate = onicecandidate; // sent event listener
// locally generated
function onicecandidate(event) {
if (!p2p_connection || !event || !event.candidate) return;
var candidate = event.candidate;
server_socket.emit('add candidate',candidate,my_username);
}
// sent by other peer
server_socket.on('add candidate', function(candidate,my_username){
p2p_connection.addIceCandidate(new RTCIceCandidate({
sdpMLineIndex: candidate.sdpMLineIndex,
candidate: candidate.candidate
}));
});
// data channel
var dataChannel = p2p_connection.createDataChannel('label');
dataChannel.onmessage = function (event) {
var data = event.data;
console.log("I got data channel message: ", data);
};
dataChannel.onopen = function (event) {
console.log("Data channel ready");
dataChannel.send("Hello World!");
};
dataChannel.onclose = function (event) {
console.log("Data channel closed.");
};
dataChannel.onerror = function (event) {
console.log("Data channel error!");
}
更新:
在那里找到了解决方案:
<>你可以考虑使用库来避免将来处理这些复杂问题。WebRTC API调用令人困惑,有时很难正确排序
simple peer
支持视频/语音流、数据通道(文本和二进制数据),甚至可以将数据通道用作node.js样式的双工流。它还支持高级选项,如禁用涓流ICE候选消息(因此每个客户端只需要发送一条提供/应答消息,而不是多次重复发送ICE候选消息)。它不固执己见,可与任何后端协同工作
抽象
- (以上由@Feross注释)
很高兴你能找到答案:)。继续写你自己的答案吧,为了子孙后代,你可以接受它。
p2p_connection.ondatachannel = function (event) {
receiveChannel = event.channel;
receiveChannel.onmessage = function(event){
console.log(event.data);
};
};