如何在WebRTC对等连接中创建数据通道?

Aad*_*hah 12 javascript webrtc

我正在尝试学习如何创建一个RTCPeerConnection以便我可以使用DataChannelAPI.以下是我从我所理解的内容中尝试过的内容:

var client = new mozRTCPeerConnection;
var server = new mozRTCPeerConnection;

client.createOffer(function (description) {
    client.setLocalDescription(description);
    server.setRemoteDescription(description);

    server.createAnswer(function (description) {
        server.setLocalDescription(description);
        client.setRemoteDescription(description);

        var clientChannel = client.createDataChannel("chat");
        var serverChannel = server.createDataChannel("chat");

        clientChannel.onmessage = serverChannel.onmessage = onmessage;

        clientChannel.send("Hello Server!");
        serverChannel.send("Hello Client!");

        function onmessage(event) {
            alert(event.data);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

我不确定出了什么问题,但我假设连接从未建立,因为没有显示任何消息.

我在哪里可以了解更多相关信息?我已经阅读了WebRTC入门 - HTML5 Rocks教程.

Aad*_*hah 13

在筛选了很多文章后我终于开始工作:http://jsfiddle.net/LcQzV/

首先我们创建对等连接:

var media = {};
media.fake = media.audio = true;
var client = new mozRTCPeerConnection;
var server = new mozRTCPeerConnection;
Run Code Online (Sandbox Code Playgroud)

当客户端连接到服务器时,它必须打开一个数据通道:

client.onconnection = function () {
    var channel = client.createDataChannel("chat", {});

    channel.onmessage = function (event) {
        alert("Server: " + event.data);
    };

    channel.onopen = function () {
        channel.send("Hello Server!");
    };
};
Run Code Online (Sandbox Code Playgroud)

当客户端创建数据通道时,服务器可能会响应:

server.ondatachannel = function (channel) {
    channel.onmessage = function (event) {
        alert("Client: " + event.data);
    };

    channel.onopen = function () {
        channel.send("Hello Client!");
    };
};
Run Code Online (Sandbox Code Playgroud)

我们需要向客户端和服务器添加假音频流以建立连接:

navigator.mozGetUserMedia(media, callback, errback);

function callback(fakeAudio) {
    server.addStream(fakeAudio);
    client.addStream(fakeAudio);
    client.createOffer(offer);
}

function errback(error) {
    alert(error);
}
Run Code Online (Sandbox Code Playgroud)

客户创建要约:

function offer(description) {
    client.setLocalDescription(description, function () {
        server.setRemoteDescription(description, function () {
            server.createAnswer(answer);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

服务器接受要约并建立连接:

function answer(description) {
    server.setLocalDescription(description, function () {
        client.setRemoteDescription(description, function () {
            var port1 = Date.now();
            var port2 = port1 + 1;

            client.connectDataConnection(port1, port2);
            server.connectDataConnection(port2, port1);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

唷.这需要一段时间才能理解.

  • 几个问题:1)不再需要假音频(现在已经很久没有了2)setLocalDescription()和setRemoteDescription()都必须有成功*和*规范提供的错误回调.Chrome和FF在这方面一直很宽松(尽管我们在FF32中有一个回归可以打破宽大处理;它可以在32.1中修复,如果不是在33中修复),但它违反了规范.3)现在不需要或使用connectionDataConnection(); 这是FF中的一个古老的临时性事物 (3认同)