2016-04-27 50 views
1

我已經構建了一個webrtc多對多系統(幾個月前:WebRTC videoconferencing (many-to-many)),使用socket.io作爲信號通道。它工作正常,但我沒有爲很多用戶處理很多房間,我只是將所有用戶放在一個房間裏(服務器端的用戶數組,node.js)。首先,當我構建系統時,我意識到當新參與者到達時我無法調用io.sockets.emit(「room」),然後創建優惠和答案。用戶(已在房間中)無法同時將其優惠發送給新參與者,新參與者無法同時將答案發送給這些用戶。它必須是一對一的連接過程,因此一個用戶(已經在房間中)將該提議發送給新參與者,並且最後一個用戶返回每個用戶的答案等等。我通過將新參與者socket_id傳遞給用戶來做到這一點,因此當用戶號碼1與新參與者一起釣魚過程連接時,他會調用服務器並向socket_id發送新參與者,然後服務器調用(io.sockets.socket(「目標「),發出(...))用戶號碼2等等。我想知道我是否做得對,我無法同時在用戶(已在房間中)和新參與者之間進行報價/答覆協商。另一方面,我知道socket.io處理多路複用,並且許多套接字可以同時連接,但是如果我使用全局變量來管理報價/響應協商,例如一個索引變量會增加如已經在房間裏的用戶得到了新的參與者連接,我的意思是這樣的:如何在webRTC多對多系統上處理socket.io多個連接?

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

,突然其他新參與者的到來而currentuser仍然連接到用戶的休息,讓我們說,用戶數4,所以索引值將是3(以編程方式)。在這種情況下會發生什麼呢?因爲這個突然的新參與者將成爲新的當前用戶,並且之前的當前用戶尚未完成與所有用戶的連接,我的意思是,他們使用相同的變量,相同的變量實例,我對此感到困惑點。我想實現爲許多用戶創建許多房間的代碼,但我需要了解這一點。

我已經測試了我的應用程序,一切正常,但我沒有測試過併發用戶連接。

我應該使用Socket.io函數(emit,clients等)而不是使用全局變量嗎?

最後我的代碼,重點socket.on(「用戶來電」,函數(室){...}

我把這個從西門彼得羅馬諾支持WebRTC實時通信,山姆達頓還關於這一主題的硬傢伙:

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); 
    } 
}); 

回答

1

一個「房間」的概念才發現參加一些圖書館可能會使用它的自負,但它不是在基線WebRTC技術的概念,因而沒有幫助的,在討論的WebRTC。

除非你通過一些中央m edia-server,您可能在每個參與者與所有其他參與者之間有一對一的連接。我已經看到這個比例最多爲3到5人。

使用「房間」模型建立和拆除連接,聽起來完全像應用程序邏輯,並且與任何WebRTC特定問題基本正交,因此您可能想要隔離問題並提出一個更簡單的問題。希望有所幫助。

+0

好吧,我明白了,是的,我有一對一的連接,我的問題是如何在使用socket.io建立所有參與者之間的連接時正確管理/處理「房間」模型信令信道。 –

+0

@ user4216713我不明白爲什麼它不起作用,只要你標記所有信號與適當的收件人,我假設你會發現基於房間號#。我看不出有什麼內在原因,當有人加入時,他們無法同時嘗試連接到每個現有參與者。我對socket.io並不熟悉,但如果它無法處理它,我會感到驚訝。祝你好運。 – jib