WebRTC/Socket.io连接两个客户端/信令

WebRTC/Socket.io连接两个客户端/信令,webrtc,Webrtc,我已经用完整的信令交换更新了我的代码。现在的问题是,在完成交换时,“socket.on('receivedAnswer')会抛出一个错误。我正在本地机器上的两个浏览器选项卡上测试所有这些,所以我假设我还不需要ICE来工作 <html> <head> <link rel = 'stylesheet' type = 'text/css' href= 'css.css'> <script src="node_modules/socket.io/node_mod

我已经用完整的信令交换更新了我的代码。现在的问题是,在完成交换时,“socket.on('receivedAnswer')会抛出一个错误。我正在本地机器上的两个浏览器选项卡上测试所有这些,所以我假设我还不需要ICE来工作

<html>
<head>
<link rel = 'stylesheet' type = 'text/css' href= 'css.css'>
<script src="node_modules/socket.io/node_modules/socket.io-client/socket.io.js"></script>
</head>
<body>
<div id='video_box'>
<video id= 'video' autoplay="true">
</video>
</div>
<div id='video_box2'>
<video id='video2' autoplay="true">
</video>
<div>
<script>
    var local_stream;
    var baseURL = getBaseURL();
    var socketIOPort = 8999;
    var socketIOLocation = baseURL + socketIOPort;
    var socket = io(socketIOLocation);
    var localvid = document.getElementById('video');
    var mediaOptions = { audio: false, video: true };
    var pc = new mozRTCPeerConnection( {"iceServers": [{"url": "stun:stun.1.google.com:19302" }] });
    var pc2 = new mozRTCPeerConnection();
    var PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    var SessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription || window.webkitRTCSessionDescription;
    var offerConstraints = {OfferToReceiveAudio: true, OfferToReceiveVideo: true }

    socket.on('receivedAnswer', function(answerSDP){
        pc.setRemoteDescription(new mozRTCSessionDescription(answerSDP), function(){
            alert('received the answer');
        }, error2);
    });

    socket.on('getPeer1', function(SDP) {
        alert('got peer 1 SDP');
        pc.setRemoteDescription(new mozRTCSessionDescription(SDP), function() { 
            pc.createAnswer(function(answerSDP){
                pc.setLocalDescription(answerSDP, function() {
                    socket.emit('answerSDP', answerSDP);
                    alert('sending answer');
                }, error2);
            }, error2);
        }, error2);
    });

    function start(){
        checkMedia();
        navigator.getUserMedia(mediaOptions, getMediaSuccess, error2);
    }

    function answer(offeredSDP){
        offeredSDP = new SessionDescription(offeredSDP);
    }

    function peer(){
        pc.addStream(local_stream);
        pc.createOffer(function(SDP){
            socket.emit('sendSDPtoServer', SDP);
        }, error2, offerConstraints);
    }

    function getMediaSuccess(stream){
        localvid.src = window.URL.createObjectURL(stream);
        local_stream = stream;
        peer(); ///////////
    }

    function error2(){
        alert('error');
    }


    function error3(){
        alert('error here');
    }

    function checkMedia() {
        if (!navigator.getUserMedia) {
            navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
        }
        if (!navigator.getUserMedia){
            alert('getUserMedia not supported in this browser.');
        }
    }

    function getBaseURL(){
        baseURL = location.protocol + "//" + location.hostname + ":" + location.port;
        return baseURL;
    }

start();
//alert('script');
</script>
</body>
</html>

这里的错误是您假设,
pc.addStream(stream)
会在同一个对等机上触发
pc.onstream(event)
,但实际上会在远程对等机上触发


除此之外,您的
webrtc
代码不完整,当您的报价SDP到达服务器时,它不会发送到远程对等方,而且它的答案必须转发给您的对等方,等等……

您必须确保在创建答案之前,您的本地流已添加到对等连接。如果您显示您在哪里生成答案,则会更清楚

var static = require('node-static');
var express = require('express');
var app = express();
var port = 8999;
var http = require('http');
var file= new(static.Server)();
var io = require('socket.io').listen(app.listen(port));
var connectedClients = {};
var peer1 = 0;
var peer2 = 0;
var peer1sdp = 0;
var peer2sdp = 0;

app.set('views', __dirname)
    .engine('html', require('ejs').renderFile)
    .use(express.static(__dirname + '/public'))
    .get('/', function(req, res) {
        //res.render('indexcpy.html');
    });




io.on('connection', function(socket) {
    console.log('a user connected');

        socket.on('disconnect', function(){
            console.log('user disconnected');
        });

        socket.on('answerSDP', function(answerSDP){
            console.log('ANSWER SENT');
            io.to(peer1).emit('receivedAnswer', answerSDP);
        });

        socket.on('sendSDPtoServer', function(SDP) {
            if(peer1 == 0){
                console.log('peer 1 ' + socket.id + ' has sent its SDP to server'); 
                peer1 = socket.id;
                peer1sdp = SDP;
            } else {
                console.log('peer 2 ' + socket.id + ' has been sent to the server');
                socket.emit('getPeer1', peer1sdp);
            }
        });



});