Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating and using a data channel between two peers with webRTC

I am trying to setup a peer to peer file sharing system using WebRTC. I'm able to open a data channel on each side, but I can't send messages from one user to another. Moreover, if one peer closes the channel, the other, the onclose event is only triggered for this user.

What's the proper way to setup and use a data channel with webRTC?

Could you tell me what's wrong or missing in my code?

//create RTC peer objet.
var RTCPeerConnection = webkitRTCPeerConnection;
var RTCIceCandidate = window.RTCIceCandidate;
var RTCSessionDescription = window.RTCSessionDescription;

var iceServers = {
    iceServers: [{
        url: 'stun:stun.l.google.com:19302'
    }]
};
var p2p_connection = new RTCPeerConnection({
      iceServers: [
        { 'url': (IS_CHROME ? 'stun:stun.l.google.com:19302' : 'stun:23.21.150.121') }
  ]
});

// send offer (only executes in one browser)
function initiateConnection() {
    p2p_connection.createOffer(function (description) {
        p2p_connection.setLocalDescription(description);
        server_socket.emit('p2p request', description,my_username);
    });
};

// receive offer and send answer
server_socket.on('p2p request', function(description,sender){ 
    console.log('received p2p request');

    p2p_connection.setRemoteDescription(new RTCSessionDescription(description));

    p2p_connection.createAnswer(function (description) {
        p2p_connection.setLocalDescription(description);
        server_socket.emit('p2p reply', description,sender);
    });
});

// receive answer
server_socket.on('p2p reply', function(description,sender){
    console.log('received p2p reply');
    p2p_connection.setRemoteDescription(new RTCSessionDescription(description));
});

// ICE candidates
p2p_connection.onicecandidate = onicecandidate; // sent event listener

// locally generated
function onicecandidate(event) {
    if (!p2p_connection || !event || !event.candidate) return;
    var candidate = event.candidate;
    server_socket.emit('add candidate',candidate,my_username);
}

// sent by other peer
server_socket.on('add candidate', function(candidate,my_username){

    p2p_connection.addIceCandidate(new RTCIceCandidate({
            sdpMLineIndex: candidate.sdpMLineIndex,
            candidate: candidate.candidate
    }));
});

// data channel 
var dataChannel = p2p_connection.createDataChannel('label');

dataChannel.onmessage = function (event) {
    var data = event.data;
    console.log("I got data channel message: ", data);
};

dataChannel.onopen = function (event) {
    console.log("Data channel ready");
    dataChannel.send("Hello World!");
};
dataChannel.onclose = function (event) {
    console.log("Data channel closed.");
};
dataChannel.onerror = function (event) {
    console.log("Data channel error!");
}

Update:

Found the solution there: http://www.html5rocks.com/en/tutorials/webrtc/basics/

p2p_connection.ondatachannel = function (event) {
    receiveChannel = event.channel;
    receiveChannel.onmessage = function(event){
    console.log(event.data);
    };
};
like image 314
bsuire Avatar asked Sep 30 '22 07:09

bsuire


2 Answers

You might consider using the simple-peer library to avoid dealing with these complexities in the future. The WebRTC API calls are confusing and the ordering is sometimes hard to get right.

simple-peer supports video/voice streams, data channel (text and binary data), and you can even use the data channel as a node.js-style duplex stream. It also supports advanced options like disabling trickle ICE candidates (so each client only needs to send one offer/answer message instead of many repeated ice candidate messages). It's un-opinionated and works with any backend.

https://github.com/feross/simple-peer

like image 128
Feross Avatar answered Oct 05 '22 08:10

Feross


Abstractions!

  • https://github.com/feross/simple-peer (noted above by @Feross)
  • https://github.com/rtc-io/rtc-mesh
  • https://github.com/dominictarr/scuttlebutt
  • https://github.com/mafintosh/peervision
  • https://github.com/muaz-khan/DataChannel

Gigantic list of related projects...

https://github.com/kgryte/awesome-peer-to-peer

like image 37
doublejosh Avatar answered Oct 05 '22 08:10

doublejosh