2014-03-24 176 views
2

我正在嘗試使用webrtc和RTCPeerConnection API構建1對1視頻聊天。我的代碼存在的問題是,在初始用戶連接到服務器後,當其他用戶通過socket.io發送消息時,它不會從服務器接收消息。客戶端只收到他們自己發出的消息。這是我的一些代碼。整個項目是在Github上在:https://github.com/rashadrussell/webrtc_experimentWebRTC視頻聊天

客戶端

var isInitiator = false; 


socket.on('initiatorFound', function(data) { 
    isInitiator = data.setInitiator; 
    console.log("Is Initiator? " + isInitiator); 
}); 


navigator.getMedia = (
     navigator.getUserMedia || 
     navigator.webkitGetUserMedia || 
     navigator.mozGetUserMedia || 
     navigator.msGetUserMedia 
    ); 

navigator.getMedia(
    {video: true, audio: false}, 
    function(stream) { 
     var video = document.getElementById("localView"); 
     video.src = window.URL.createObjectURL(stream); 
     console.log("Add Stream"); 
     sendMessage('streamAdd', {streamAdded: 'stream-added'}); 

     createPeerConnection(); 
     pc.addStream(stream); 

     if(isInitiator) 
     { 
      callPeer(); 
     } 

    }, 
    function(err) { 
     console.log("The following error occured: "); 
     console.dir(err); 
    } 

); 


function sendMessage(type, message) 
{ 
    console.log("Sending Message"); 
    socket.emit('message',{ 
     "type": type, 
     "message": message 
    }); 
} 

function createPeerConnection() { 

    pc = new rtcPeerConnection(servers, options); 
    console.dir(pc); 

    pc.onicecandidate = function(evt) { 
     if(evt.candidate == null) return; 
     pc.onicecandidate = null;   

     console.log("Send Ice Candidate"); 
     sendMessage("iceCandidate", JSON.stringify(evt.candidate)); 
    }; 

    pc.onaddstream = function(evt) { 
     document.body.append("<video id='remoteVideo' autoplay></video>"); 
     var remoteVid = document.getElementById("remoteVideo"); 
     remoteVid.src = window.URL.createObjectURL(evt.stream); 
    }; 

} 


function callPeer() { 

    pc.createOffer(function (offer) { 
      pc.setLocalDescription(offer, function() { 
       sendMessage("offer", JSON.stringify(offer)); 
      }); 
      console.log("Send Offer"); 
     }, function(err) { console.log("Offer Error: " + err) }, 
      videoConstraints 
     ); 

} 

function answerPeer() { 

    pc.createAnswer(function(answer) { 
     pc.setLocalDescription(answer); 
     sendMessage("answer", JSON.stringify(answer)) 
    }, function(err) { console.log("Sending Answer Error: " + err) }, 
     videoConstraints 
    ); 

} 

socket.on('message', function(message) { 
    console.log("CONSOLE MESSAGE:"); 
    console.dir(message); 

    if(message.type == 'streamAdd') { 
     console.log('Stream was added'); 
     createPeerConnection(); 

     if(isInitiator) { 
      callPeer(); 
     } 

    } else if(message.type == 'offer') { 

     pc.setRemoteDescription(new rtcSessionDescription(JSON.parse(message.message))); 

     if(!isInitiator) 
     { 
      console.log("Sending Answer"); 
      answerPeer(); 
     } 


    } else if(message.type == 'answer') { 
     pc.setRemoteDescription(new rtcSessionDescription(JSON.parse(message.message))); 
    } else if(message.type == 'iceCandidate') { 
     console.log("Get Ice Candidate"); 
     pc.addIceCandidate(new rtcIceCandidate(JSON.parse(message.message))); 
    } 

}); 

服務器端

var isInitiator = false; 
io.sockets.on('connection', function(socket) { 

    if (!isInitiator) { 
     isInitiator = true; 
     socket.emit('initiatorFound', {setInitiator: isInitiator}); 
    } else { 
     socket.emit('initiatorFound', {setInitiator: !isInitiator}); 
    } 

    // Signaling Channel 
    socket.on('message', function(message) { 

     if (message.type == 'streamAdd') { 
     console.log('Got message: ' + message); 
     } 
     //socket.emit('message' ,message); 
     // Should be: 
     socket.broadcast.emit('message', message); 

    }); 

}); 

回答

2

見,如果你想將消息發送到特定的用戶設置唯一的ID(socket.id),但現在你正在嘗試只是測試正確所以改變你的服務器端代碼

VAR isInitiator = FALSE;

io.sockets.on('connection', function(socket) { 

    if (!isInitiator) { 
     isInitiator = true; 
     socket.emit('initiatorFound', {setInitiator: isInitiator}); 
    } else { 
     socket.emit('initiatorFound', {setInitiator: !isInitiator}); 
    } 

    // Signaling Channel 
    socket.on('message', function(message) { 

     if (message.type == 'streamAdd') { 
     console.log('Got message: ' + message); 
     } 
     socket.emit('message' ,message); 

    }); 

}); 

請看這裏socket.emit('message',message);這個套接字對象包含你的ID,所以它發送一條消息給你,如果你想發送一條消息給特定用戶你知道unique.id任何方式發送消息到每個連接期望這個插座(平均當前插座)

io.sockets.on('connection', function(socket) { 

    if (!isInitiator) { 
     isInitiator = true; 
     socket.emit('initiatorFound', {setInitiator: isInitiator}); 
    } else { 
     socket.emit('initiatorFound', {setInitiator: !isInitiator}); 
    } 

    // Signaling Channel 
    socket.on('message', function(message) { 

     if (message.type == 'streamAdd') { 
     console.log('Got message: ' + message); 
     } 
     socket.broadcast.emit('message' ,message); 

    }); 

}); 
0

我想通了,爲什麼其他客戶端沒有被通知時會發出一條消息。在我的服務器端代碼中,在信令通道部分,socket.emit應該是socket.broadcast.emit或io.sockets.emit。

Socket.emit只將消息傳遞迴發起呼叫服務器的客戶端。 socket.broadcast.emit將消息轉發給除發起呼叫的客戶端以外的所有客戶端,並且io.sockets.emit將消息轉發給所有客戶端,包括髮起呼叫的客戶端。