2016-04-27 4 views
1

Ich habe ein webrtc many-to-many-System (vor ein paar Monaten: WebRTC videoconferencing (many-to-many)) gebaut, mit socket.io als Signalkanal. Es funktioniert gut, aber ich habe noch nicht viele Räume für viele Benutzer, ich stelle nur alle Benutzer in einem einzigen Raum zusammen (ein Benutzer-Array auf der Serverseite, node.js). Zu aller erst, als ich das System baute, erkannte ich, dass ich io.sockets.emit ("room") nicht anrufen konnte, wenn ein neuer Teilnehmer ankam und dann Angebote und Antworten erstellte. Die Benutzer (die bereits im Raum waren) konnten ihre Angebote nicht gleichzeitig an den neuen Teilnehmer senden, und der neue Teilnehmer konnte die Antwort nicht gleichzeitig an diese Benutzer senden. Es muss ein Eins-zu-eins-Verbindungsprozess sein, so dass ein Benutzer (der bereits im Raum ist) das Angebot an den neuen Teilnehmer sendet, und dieser letztere gibt die Antwort und so weiter mit jedem Benutzer zurück. Ich habe dies gemacht, indem ich den neuen Teilnehmer socket_id über die Benutzer weiterleite. Wenn Benutzer Nummer eins die Prozessverbindung mit dem neuen Teilnehmer fischt, ruft er den Server an und sendet dem neuen Teilnehmer die socket_id, dann ruft der Server auf (io.sockets.socket (" Ziel "). emit (...)) Benutzer Nummer zwei und so weiter. Ich möchte wissen, ob ich richtig handle, dass ich das Angebot/die Verhandlung zwischen den Benutzern (bereits im Raum) und dem neuen Teilnehmer zur gleichen Zeit nicht machen kann.Wie behandelt man socket.io mehrere Verbindungen auf einem webRTC-N-zu-viele-System?

Auf der anderen Seite weiß ich, dass socket.io Multiplexing behandelt, und viele Sockets können zur gleichen Zeit verbinden, aber wenn ich mit globalen Variablen arbeiten, um Angebot/Antwort Verhandlungen, zum Beispiel eine Indexvariable, zu verwalten wie der Benutzer bereits im Raum mit dem neuen Teilnehmer verbunden hätte, ich dies bedeuten:

users[index];//let's say we have 5 users and currentuser is the new guy 
io.sockets.socket(users[index]).emit('user incoming', currentuser); 

und plötzlich andere neue Teilnehmer ankommen, während Current noch auf den Rest des Benutzers verbindet, sagt sie mal, Benutzernummer 4, so Der Indexwert wäre 3 (programmgesteuert). Was würde in diesem Fall passieren ?, weil dieser plötzliche neue Teilnehmer der neue currentuser sein würde und der vorherige currentuser nicht die Verbindung zu allen Benutzern beendet hat, ich meine, Sie benutzen die gleichen Variablen, die selbe Variableninstanz, das hat mich verwirrt Punkt. Ich möchte Code für die Erstellung vieler Räume für viele Benutzer implementieren, aber ich muss das verstehen.

Ich habe meine App getestet und alles funktioniert gut, aber ich habe nicht mit gleichzeitigen Benutzern Verbindung getestet.

Sollte ich mit den Socket.io-Funktionen (emit, Clients, etc) anstelle von globalen Variablen arbeiten ?.

Schließlich mein Code, den Schwerpunkt auf socket.on ('user eingehendes', function (Zimmer) {...}

Ich nahm diese von Echtzeit-Kommunikation mit WebRTC von Simon Pietro Romano, Sam Dutton ist auch ein harter Kerl zu diesem Thema:

var users = []; 
var currentuser; 
var index = -1; 

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

    // Handle 'message' messages 
    socket.on('message', function (message, target) { 
      log('S --> got message: ', message); 
      // channel-only broadcast... 
      io.sockets.socket(target).emit('message', message, socket.id); 
    }); 

    // Handle 'create or join' messages 
    socket.on('create or join', function (room) { 
      var numClients = io.sockets.clients(room).length; 

      log('S --> Room ' + room + ' has ' + numClients + ' client(s)'); 
      log('S --> Request to create or join room', room); 

      // First client joining... 
      if (numClients == 0){ 
        socket.join(room); 
        currentuser = socket.id; 
        //users.push(socket.id); 
        log('socked id:' + socket.id); 
        socket.emit('created', room); 
      } else if (numClients > 0 && numClients < 6) { 
      // Second client joining...     
        //io.sockets.in(room).emit('join', room); 
        socket.join(room); 
        currentuser = socket.id; 
        log('socked id:' + socket.id); 
        socket.emit('joined', room);            

      } else { // max two clients 
        socket.emit('full', room); 
      } 
    }); 

    // Handle new incoming user 
    socket.on('user incoming', function (room) { 

      index++; 
      if(index < users.length){ 

       log('calling user ' + users[index]);        
       io.sockets.socket(users[index]).emit('user incoming', 
       currentuser); 

      }else{ 
       users.push(currentuser); 
       index = -1; 
      } 

      /


    }); 

    socket.on('renegotiation', function (message, target) { 
      log('S --> got message: ', message); 
      // channel-only broadcast... 
      io.sockets.socket(target).emit('renegotiation', message, 
      socket.id); 
    }); 

    function log(){ 
     var array = [">>> "]; 
     for (var i = 0; i < arguments.length; i++) { 
      array.push(arguments[i]); 
     } 
     socket.emit('log', array); 
    } 
}); 

Antwort

1

Das Konzept eines „Raumes“ ist nur ein Einbildung Teilnehmer zu entdecken Einige Bibliotheken es verwenden können, aber es ist kein Konzept in Grundlinie WebRTC, also nicht hilfreich WebRTC in der Diskussion.

Es sei denn, Sie sind durch einige zentrale m edia-server, haben Sie wahrscheinlich ein Netz von Eins-zu-eins-Verbindungen zwischen jedem Teilnehmer zu allen anderen Teilnehmern. Ich habe diese Skala von 3 bis 5 Teilnehmern gesehen.

Die Verwendung eines "Raum" -Modells zum Einrichten und Abbauen von Verbindungen klingt völlig nach Anwendungslogik und weitgehend orthogonal zu allen WebRTC-spezifischen Problemen. Daher möchten Sie das Problem isolieren und eine einfachere Frage stellen. Ich hoffe, das hilft.

+0

Ok Jib, ich verstehe, und ja, ich habe ein Netz von Eins-zu-eins-Verbindungen, und meine Frage ist, wie man das "Raum" -Modell beim Verbindungsaufbau zwischen allen Teilnehmern mit socket.io korrekt verwaltet/handhabt Signalisierungskanal. –

+0

@ user4216713 Ich sehe nicht, warum es nicht funktionieren würde vorausgesetzt, Sie alle Signalisierung mit den entsprechenden Empfänger (s), die ich vermute, dass Sie irgendwie basierend auf Raum # entdecken würde taggen. Ich sehe keinen inhärenten Grund, warum, wenn jemand beitritt, sie nicht versuchen können, sich gleichzeitig mit jedem der vorhandenen Teilnehmer zu verbinden. Ich bin mit socket.io nicht sehr vertraut, aber ich wäre überrascht, wenn es nicht damit umgehen würde. Viel Glück. – jib

Verwandte Themen