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 の基本的な使用法ページからほぼそのまま引用されています。
ローカルホストで Chrome を使用してテストしているので、ファイアウォールは問題になりません。
交換が行われると、両方の接続にローカルおよびリモートの記述子が設定されます。データチャンネルreadyState
はconnecting
. PeerConnection のiceConnectionState
isnew
とそのsignalingState
is stable
。
何が欠けていますか?