如何在webRTC多对多系统上处理socket.io多个连接?

时间:2016-04-27 06:44:23

标签: javascript node.js socket.io webrtc

我已经构建了一个webrtc多对多系统(几个月前:WebRTC videoconferencing (many-to-many)),使用socket.io作为信令通道。它工作正常,但我没有处理许多用户的许多房间,我只是将所有用户放在一个单独的房间(服务器端的用户阵列,node.js)。首先,当我构建系统时,我意识到当新参与者到达然后创建提供和答案时,我无法调用io.sockets.emit(“room”)。用户(已经在房间中)无法同时向新参与者发送他们的报价,新参与者无法同时向这些用户发送回复。它必须是一对一的连接过程,因此一个用户(已经在房间中)将要约发送给新参与者,最后一个用户返回答案,依此类推每个用户。我通过将新参与者socket_id传递给用户来实现此目的,因此当用户一号与新参与者进行过程连接时,他调用服务器并向新参与者发送socket_id,然后服务器调用(io.sockets.socket(“ target“)。emit(...))用户号码2,依此类推。我想知道我做得对,我不能同时在用户(已经在房间里)和新参与者之间进行提议/回答协商。

另一方面,我知道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('用户传入',功能(房间){...}

我从Simon Pietro Romano的webRTC实时通讯中获取了这一点,Sam Dutton也是这个主题的硬汉:

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 个答案:

答案 0 :(得分:1)

“房间”的概念只是发现参与者的自负。有些图书馆可能会使用它,但它不是基线WebRTC中的概念,因此对讨论WebRTC没有帮助。

除非您通过某个中央媒体服务器进行路由,否则您可能在每个参与者与所有其他参与者之间建立一对一连接。我已经看到这个比例达到最多3到5个参与者

使用“房间”模型来设置和拆除连接,听起来完全像应用程序逻辑,并且基本上与任何WebRTC特定问题正交,因此您可能希望隔离问题并提出一个更简单的问题。希望有所帮助。

相关问题