我正在尝试使用web套接字在客户端之间创建一个WebRTC数据通道。
我列出了一些ICE服务器
var rtcsettings = {
iceServers: [
{url: "stun:stun.ekiga.net"},
{url: "stun:stun.voipbuster.com"},
{url: "stun:stun.1.google.com:19302"},
]
};然后有一个连接函数,它创建一个通道,提供并通过web套接字发送它。
function(them) {
var pc = new RTCPeerConnection(rtcsettings);
self.channel = pc.createDataChannel("gamelink");
console.log(pc, self.channel);
self.peerconnection = pc;
pc.createOffer(function(offer) {
pc.setLocalDescription(new RTCSessionDescription(offer), function() {
self.socket.send(JSON.stringify({
"to": them,
"uuid": uuid,
"offer": offer,
}));
}, pc.close);
}, pc.close);
}然后,在另一端有一个回调,该回调将提供添加到其连接并发送响应。
它还会在添加数据通道时设置一个回调,但它从不触发。我遗漏了什么?
function (message){
var offer = message.offer;
var pc = new RTCPeerConnection(rtcsettings);
pc.ondatachannel = function(ch) {
self.channel = ch;
console.log(self.channel);
}
console.log(pc);
pc.setRemoteDescription(new RTCSessionDescription(offer), function() {
pc.createAnswer(function(answer) {
pc.setLocalDescription(new RTCSessionDescription(answer), function() {
self.socket.send(JSON.stringify({
"to": message.uuid,
"uuid": uuid,
"answer": answer,
}));
}, pc.close);
}, pc.close);
}, pc.close);
self.peerconnection = pc;
}然后,最后在启动器上有另一个回调,将响应描述符添加到它的连接中。
function(message) {
self.peerconnection.setRemoteDescription(
new RTCSessionDescription(message.answer),
function() { },
self.peerconnection.close);
}除了套接字和数据通道之外的所有代码几乎都是从MDN Basic Usage页面逐字提取的。
我在本地主机上使用Chrome进行测试,所以防火墙应该不是问题。
交换发生后,两个连接都有一个本地和远程描述符集。数据信道readyState是connecting。对等连接的iceConnectionState为new,其signalingState为stable。
遗漏了什么?
发布于 2015-03-01 05:29:37
你需要处理ICE考生。
在上,的两端都需要这样的回调:
pc.onicecandidate = function(e) {
if(e.candidate) {
self.socket.send(JSON.stringify({
"to": message.uuid,
"uuid": uuid,
"candidate": e.candidate,
}));
}
};和处理程序
callbacks["candidate"] = function(message) {
console.log(message)
self.peerconnection.addIceCandidate(new RTCIceCandidate(message.candidate));
}发布于 2015-03-01 06:38:04
将这些设置添加到您的RTCPeerConnection
var optionalRtpDataChannels = {
optional: [{RtpDataChannels: true}]
};
var pc = new RTCPeerConnection(rtcsetting, optionalRtpDataChannels);https://stackoverflow.com/questions/28786173
复制相似问题