2015-08-23 10 views
8

Die Absicht ist, dies zu einem Community Wiki Beitrag zu werden, der auf dem neuesten Stand gehalten wird, so dass Entwickler die Kommunikation von JSON-Nachrichten Browser-zu-Browser (P2P) mit WebRTC DataChannels implementieren möchten haben einfache, aber funktionale Beispiele.Working Hello World WebRTC DataChannel Beispiele mit Signalisierung implementiert

WebRTC DataChannels sind experimentell und noch im Entwurf. Es scheint, dass das Web derzeit ein Minenfeld veralteter WebRTC-Beispiele ist und noch mehr, wenn ein Entwickler versucht, die RTCDataChannel-API zu lernen.

Einfache, aber funktionale 1-seitige Beispiele, die heute über WebRTC compliant browsers arbeiten, scheinen sehr schwer zu finden. Beispiel: some examples lässt eine Signalisierungsimplementierung aus, others funktioniert nur für einen einzelnen Browser (z. B. Chrome-Chrome), many sind wegen kürzlich vorgenommener API-Änderungen veraltet und others sind so komplex, dass sie eine Einstiegshürde darstellen.

Bitte senden Sie Beispiele, die die folgenden Kriterien erfüllen (wenn etwas nicht erfüllt ist bitte angeben):

  1. Client-seitige Code 1-Seite (200 Zeilen oder weniger)
  2. Server-Side-Code ist 1-Seite und Technologie verwiesen (zB node.js, pHP, python, etc.)
  3. Signalmechanismus implementiert und Protokolltechnologie verwiesen wird (zB WebSockets, long polling, GCM, etc.)
  4. Arbeits Code, der ausgeführt wird Cross-Browser (Chrome, Firefox, Opera und/oder Bowser)
  5. Minimal Optionen, Fehlerbehandlung, abstraction usw. - die Absicht ist, ein elementares Beispiel

Antwort

4

Hier ist ein funktionierendes Beispiel ist die HTML5 WebSockets verwendet für die Signalisierung und einem Knoten js Backend

Signaltechnik: WebSockets
Client: pure html/javascript
Server: node.js, ws
zuletzt am getestet: Firefox 40.0.2, Chrome 44.0.2403.157 m, Opera 31.0.1889.174


clientseitigen Code:

<html> 
<head> 
</head> 
<body> 
    <p id='msg'>Click the following in different browser windows</p> 
    <button type='button' onclick='init(false)'>I AM Answerer Peer (click first)</button> 
    <button type='button' onclick='init(true)'>I AM Offerer Peer</button> 

<script> 
    (function() { 
     var offererId = 'Gandalf', // note: client id conflicts can happen 
      answererId = 'Saruman', //  no websocket cleanup code exists 
      ourId, peerId, 
      RTC_IS_MOZILLA = !!window.mozRTCPeerConnection, 
      RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection || window.msRTCPeerConnection, 
      RTCSessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription || window.msRTCSessionDescription, 
      RTCIceCandidate = window.RTCIceCandidate || window.mozRTCIceCandidate || window.msRTCIceCandidate, 
      rtcpeerconn = new RTCPeerConnection(
        {iceServers: [{ 'url': 'stun:stun.services.mozilla.com'}, {'url': 'stun:stun.l.google.com:19302'}]}, 
        {optional: [{RtpDataChannels: false}]} 
       ), 
      rtcdatachannel, 
      websocket = new WebSocket('ws://' + window.location.hostname + ':8000'), 
      comready, onerror; 

     window.init = function(weAreOfferer) { 
      ourId = weAreOfferer ? offererId : answererId; 
      peerId = weAreOfferer ? answererId : offererId; 

      websocket.send(JSON.stringify({ 
       inst: 'init', 
       id: ourId 
      })); 

      if(weAreOfferer) { 

       rtcdatachannel = rtcpeerconn.createDataChannel(offererId+answererId); 
       rtcdatachannel.onopen = comready; 
       rtcdatachannel.onerror = onerror; 

       rtcpeerconn.createOffer(function(offer) { 
        rtcpeerconn.setLocalDescription(offer, function() { 
         var output = offer.toJSON(); 
         if(typeof output === 'string') output = JSON.parse(output); // normalize: RTCSessionDescription.toJSON returns a json str in FF, but json obj in Chrome 

         websocket.send(JSON.stringify({ 
          inst: 'send', 
          peerId: peerId, 
          message: output 
         })); 
        }, onerror); 
       }, onerror); 
      } 
     }; 

     rtcpeerconn.ondatachannel = function(event) { 
      rtcdatachannel = event.channel; 
      rtcdatachannel.onopen = comready; 
      rtcdatachannel.onerror = onerror; 
     }; 

     websocket.onmessage = function(input) { 
      var message = JSON.parse(input.data); 

      if(message.type && message.type === 'offer') { 
       var offer = new RTCSessionDescription(message); 

       rtcpeerconn.setRemoteDescription(offer, function() { 
        rtcpeerconn.createAnswer(function(answer) { 
         rtcpeerconn.setLocalDescription(answer, function() { 
          var output = answer.toJSON(); 
          if(typeof output === 'string') output = JSON.parse(output); // normalize: RTCSessionDescription.toJSON returns a json str in FF, but json obj in Chrome 

          websocket.send(JSON.stringify({ 
           inst: 'send', 
           peerId: peerId, 
           message: output 
          })); 
         }, onerror); 
        }, onerror);     
       }, onerror); 
      } else if(message.type && message.type === 'answer') {    
       var answer = new RTCSessionDescription(message); 
       rtcpeerconn.setRemoteDescription(answer, function() {/* handler required but we have nothing to do */}, onerror); 
      } else if(rtcpeerconn.remoteDescription) { 
       // ignore ice candidates until remote description is set 
       rtcpeerconn.addIceCandidate(new RTCIceCandidate(message.candidate)); 
      } 
     }; 

     rtcpeerconn.onicecandidate = function (event) { 
      if (!event || !event.candidate) return; 
      websocket.send(JSON.stringify({ 
       inst: 'send', 
       peerId: peerId, 
       message: {candidate: event.candidate} 
      })); 
     }; 

     /** called when RTC signaling is complete and RTCDataChannel is ready */ 
     comready = function() { 
      rtcdatachannel.send('hello world!'); 
      rtcdatachannel.onmessage = function(event) { 
       document.getElementById('msg').innerHTML = 'RTCDataChannel peer ' + peerId + ' says: ' + event.data;  
      } 
     }; 

     /** global error function */ 
     onerror = websocket.onerror = function(e) { 
      console.log('====== WEBRTC ERROR ======', arguments); 
      document.getElementById('msg').innerHTML = '====== WEBRTC ERROR ======<br>' + e; 
      throw new Error(e); 
     }; 
    })(); 
</script> 
</body> 
</html>

serverseitigen Code:

var server = require('http').createServer(), 
    express = require('express'),  
    app = express(), 
    WebSocketServer = require('ws').Server, 
    wss = new WebSocketServer({ server: server, port: 8000 }); 

app.use(express.static(__dirname + '/static')); // client code goes in static directory 

var clientMap = {}; 

wss.on('connection', function (ws) { 
    ws.on('message', function (inputStr) { 
     var input = JSON.parse(inputStr); 
     if(input.inst == 'init') { 
      clientMap[input.id] = ws; 
     } else if(input.inst == 'send') { 
      clientMap[input.peerId].send(JSON.stringify(input.message)); 
     } 
    }); 
}); 

server.on('request', app); 
server.listen(80, YOUR_HOSTNAME_OR_IP_HERE, function() { console.log('Listening on ' + server.address().port) });
+0

Fehler WebSocket zu erhalten ist bereits in Schließ- oder geschlossenen Zustand – Wajihurrehman

+0

immer Fehler WebSocket ist bereits im Zustand SCHLIESSEN oder GESCHLOSSEN. auf dieser Zeile Code könnten Sie mir bitte sagen, warum websocket.send (JSON.stringify ({ inst: 'init', id: ourId })); ich bin neu mit websockets und wrtc erstellen zwei zwei Dateien ein Vorserver und eine HTML-Datei für den Client und öffnen in zwei verschiedenen Browsern. – Wajihurrehman