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

标签 javascript node.js socket.io webrtc

我已经构建了一个webrtc多对多系统(几个月前:WebRTC videoconferencing (many-to-many)),使用socket.io作为信令 channel 。它工作正常,但我还没有为许多用户处理许多房间,我只是将所有用户放在一个房间中(服务器端的用户数组,node.js)。首先,当我构建系统时,我意识到我无法调用 io.sockets.emit("room") 来在新参与者到达时发出信号,然后创建报价和答案。用户(已在房间中)无法同时将其报价发送给新参与者,新参与者也无法同时将答案发送给这些用户。它必须是一对一的连接过程,因此一个用户(已经在房间中)将报价发送给新参与者,最后一个用户向每个用户返回答案,依此类推。我通过将新参与者的 socket_id 传递给用户来做到这一点,因此当一号用户钓鱼与新参与者的进程连接时,他调用服务器并向新参与者发送 socket_id,然后服务器调用 (io.sockets.socket("target").emit(...)) 第二个用户,依此类推。我想知道我做得是否正确,我无法同时在用户(已经在房间中)和新参与者之间进行报价/答案协商。

另一方面,我知道 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);

突然,当当前用户仍在连接到其他用户时,其他新参与者到达,比方说,用户号为 4,因此索引值将为 3(以编程方式)。在这种情况下会发生什么?因为这个突然的新参与者将是新的当前用户,而之前的当前用户尚未完成与所有用户的连接,我的意思是,他们使用相同的变量,相同的变量实例,我对此感到困惑观点。我想实现为许多用户创建许多房间的代码,但我需要理解这一点。

我已经测试了我的应用程序,一切正常,但我还没有测试并发用户连接。

我应该使用 Socket.io 函数(发出、客户端等)而不是使用全局变量吗?

最后是我的代码,重点关注socket.on('用户传入', function (room){...}

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

最佳答案

“房间”的概念只是一个发现参与者的幻想。有些库可能会使用它,但它不是基线 WebRTC 中的概念,因此对讨论 WebRTC 没有帮助。

除非您通过某个中央媒体服务器进行路由,否则每个参与者与所有其他参与者之间可能会存在一对一连接的网格。我见过最多 3 到 5 名参与者的规模。

使用“房间”模型来建立和断开连接,听起来完全像应用程序逻辑,并且在很大程度上与任何 WebRTC 特定问题正交,因此您可能想要隔离问题并提出一个更简单的问题。希望有帮助。

关于javascript - 如何在 webRTC 多对多系统上处理 socket.io 多个连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36882266/

相关文章:

javascript - Webpack 并在保留文件结构的同时进行复制

javascript - 使用 nodeJS 或 Javascript 将 HTML + CSS 转换为 PDF?

javascript - node.js 的哪个 ORM?

javascript - Socket.io - 通过 https 从客户端连接到服务器

node.js - Socket.io 和 Express js 的分离

javascript - 如何使用 firefox 插件 sdk 创建一个选项弹出对话框?

javascript - 父级 DOM 元素中子级 DOM 元素的索引

javascript - jquery函数包含来自外部的变量,但无法读取它

node.js - 在后面或前面映射响应

socket.io - 无法连接 Treeline 上的套接字