Socket.io 多连接

     2023-04-18     127

关键词:

【中文标题】Socket.io 多连接【英文标题】:Socket.io multiple connections 【发布时间】:2016-09-15 17:26:42 【问题描述】:

我还没有真正找到有关文档的奇怪问题。我认为这可能最终会成为“您不了解产品的工作原理”的简单案例,我希望有人可以填补空白。

这是怎么回事...我有 3 个独立的应用程序,它们是 socket.io 服务器。他们都在监听不同的端口。每个服务器都用于不同的专门用途。我正在构建应用程序,以便我可以部分扩展它,并且只影响我需要更改/更新的各个独立部分。

这很好,直到我意识到对于每个运行的应用程序都有一个额外的套接字连接每个服务器。因此,如果我有 3 个应用程序,那么我在每台服务器上都有 3 个连接。

这方面的证据是,如果我向每个服务器添加一个 console.log("Connected") 然后连接一个客户端,每个服务器报告的连接数与服务器数一样多。希望这是有道理的。

我的目标是每台服务器有 1 个连接。似乎每个连接都充当到所有套接字服务器的通用连接。我的服务器监听器是这样设置的:

io = require('socket.io').listen(26265) // can use up to 26485

我的客户是这样连接的:

socket = new io('http://localhost:26265')

编辑:

添加到我原来的问题,以便您可以看到更多代码...

完整的客户端代码:

importJS('/js/pages/admin_base.js',function()     
        AdminIO = new io('http://localhost:26266');
        AdminIO.on('send_users',function(rows)
            toggleLoad();
            /*
            if(typeof rows === 'object')
                rows = Array(rows);
               
            */  
            appendUsers(rows);       
            console.log(rows);
        );
        AdminIO.on('failed_users',function()
            toggleLoad();
            dropInfo("Failed to retrieve userlist",level: "error");
        );
        AdminIO.on('test',function (q) 
            console.log(q);
        );
    queryUsers(AdminIO);
);

服务器代码很长...所以相关部分是:

var io = require('socket.io').listen(26266); // can use up to 26484
//.... imported additional modules and defined simple functions here
io.on('connection', function (socket)   
    socket.on('restart_request', function(req)
        var success = false
            , session = JSON.parse(req.session)
            , sessionID = session.sessionID;
        checkSession(sessionID, function (ses) 
            if (ses === false)  console.error('CheckSession failed: No session exists'); return; 
            if (ses.user.uuid !== session.uuid)  console.error('CheckSession failed: UUID mismatched'); return; 
            if (ses.user.role < conf['Permissions']['lm_restart']) socket.emit('restart_fail','Insufficient permissions.'); return; 
            if(process.platform === 'win32')            
                executeCMD('START "" .\\windows\\scripts\\restart_lm.bat',function(err,res)
                    var errSent = false;
                    if(err)                        
                        console.error(err);
                        if(!errSent) socket.emit('restart_fail','Restart failed'); 
                        errSent = true;
                        if(res === null)return;
                    
                    console.log(res);
                    socket.emit('restart_success','LM successfully restarted.');
                );                
            
            else if(process.platform === 'linux')

            
        );
    );
    socket.on('get_users',function(req)
          var success = false
            , session = JSON.parse(req.session)
            , opts = req.opts || null
            , sessionID = session.sessionID
            , col = opts.col || null
            , where = opts.where || null
            , range = opts.range || null
            ;
        checkSession(sessionID, function (ses) 
            if (!ses)  console.error('CheckSession failed: No session exists'); return; 
            if (ses.user.uuid !== session.uuid)  console.error('CheckSession failed: UUID mismatched'); return; 
            if (ses.user.role < conf['Permissions']['lm_user_query']) socket.emit('userQuery_fail','Insufficient permissions.'); return;             
            Query.users(col: col, where: where, range: range,function(err,res)
                if(!err)socket.emit('send_users',res);
                else socket.emit('failed_users',true); 
            );            
        );
    );
    socket.on('test',function(q)
        socket.emit('test',q);
    );
);

【问题讨论】:

多连接有什么问题? 如果只是多个连接,那将不是问题。问题在于,对于多个连接,所有 .emit() 命令都会运行多次。这意味着浪费了大量的时间/网络资源 听起来你要么发射到错误的东西,要么在错误的地方。 您需要向我们展示更多代码,因为您展示的内容不会创建多个连接,除非该代码位于页面中的多个位置。 我根据@jfriend00 的要求添加了更多代码。谢谢! 【参考方案1】:

尝试从 io 事物中删除 'new' 关键字。 您不应该在此处使用“新”,因为每次重新加载页面或新客户端连接时都会创建新实例。 所以,它应该看起来像: 服务器端:

var io = require('socket.io')(26265);

客户端:

var socket = io('http://localhost:26265');

我想这就是你要找的东西。

【讨论】:

有趣,我会在我回去工作时试一试。谢谢! 那是完全错误的。那是客户端连接;它需要一个实例。这要么失败,要么没有任何区别。 根据socket.io,我认为没有错。 Socket.IO 使用 1 个 websocket 传输其所有数据。因此,无需为每个客户端创建一个实例。无论如何,你比我更了解,因为我还在学习,sn-p 非常适合我。 感谢 KAKAN 的创意。我在没有定义新对象的情况下尝试了它。不幸的是,所有这一切似乎都是在每次构建套接字时重新定义会话。 “new”关键字允许构建函数的新“副本”及其原型。所以这没有用,不过谢谢你的想法!

处理浏览器重新加载 socket.io

】处理浏览器重新加载socket.io【英文标题】:Handlebrowserreloadsocket.io【发布时间】:2013-12-1403:21:15【问题描述】:socket.io中有一种方法可以在断开连接的事件中创建一个超时,然后检查用户是否已经重新连接?这个想法是只有当... 查看详情

( Socket.io ) 一个socket连接多个房间

】(Socket.io)一个socket连接多个房间【英文标题】:(Socket.io)Onesocketconnectionmultiplerooms【发布时间】:2016-12-1405:28:53【问题描述】:我在使用socket.io时遇到问题。我尝试创建一个连接到多个房间的单套接字连接。这是我当前的代码:... 查看详情

与 socket.io 相关的可扩展性问题

】与socket.io相关的可扩展性问题【英文标题】:scalabilityissuesrelatingtosocket.io【发布时间】:2012-03-2911:55:14【问题描述】:在socket.io的主页上,它没有说明任何与可扩展性问题相关的内容。有谁知道它一次可以处理多少个并发连接... 查看详情

socket.io / 连接参数

】socket.io/连接参数【英文标题】:socket.io/parametersonconnection【发布时间】:2014-09-2420:29:44【问题描述】:在我的node.js/Express.js应用程序中,我需要通过socket.io连接传递参数(在另一篇文章中看到)。在客户端,我有类似的东西:... 查看详情

Flutter + socket.io 连接

】Flutter+socket.io连接【英文标题】:Flutter+socket.ioconnection【发布时间】:2021-08-0506:17:04【问题描述】:我正在尝试使用Fluttersocket_io_client连接nodejs套接字。但它没有连接,服务器运行良好。下面是服务器代码,在颤振中我使用了so... 查看详情

Socket.io 连接恢复为轮询,从不触发“连接”处理程序

】Socket.io连接恢复为轮询,从不触发“连接”处理程序【英文标题】:Socket.ioconnectionrevertstopolling,neverfiresthe\'connection\'handler【发布时间】:2014-08-0202:24:04【问题描述】:我正在尝试将socket.io添加到我现有的node.js应用程序中。我... 查看详情

socket.io分布式

socket.io是目前较为流行的web实时推送框架,其基于nodejs语言开发,底层用engine.io实现。借助nodejs语言异步的特性,其获得了不错的性能。但单个实例的socket.io依然承载能力有限,最多只能容纳3000个long-polling方式的客户端进行连... 查看详情

Socket.IO 服务器性能和带宽使用

】Socket.IO服务器性能和带宽使用【英文标题】:Socket.IOserverperformanceandbandwidthusage【发布时间】:2013-09-2507:12:02【问题描述】:我即将在本地计算机上托管一个小型套接字服务器,我想知道它将使用什么样的带宽。在大多数情况... 查看详情

Node.js、多线程和 Socket.io

】Node.js、多线程和Socket.io【英文标题】:Node.js,multi-threadingandSocket.io【发布时间】:2012-01-2316:55:53【问题描述】:我希望Socket.io在Node.jsv.0.6.0及更高版本中使用nativeloadbalancing(“集群”)进行多线程工作。据我了解,Socket.io使用... 查看详情

Socket.IO 中的跨域连接

】Socket.IO中的跨域连接【英文标题】:Cross-domainconnectioninSocket.IO【发布时间】:2012-02-1618:11:36【问题描述】:可以跨域使用Socket.IO吗?如果是这样,怎么做?网上都提到了这种可能性,但没有在任何地方给出代码示例。【问题讨... 查看详情

Socket.io 中的连接不稳定

】Socket.io中的连接不稳定【英文标题】:ConnectionisnotstableinSocket.io【发布时间】:2016-02-2104:37:45【问题描述】:我正在使用socket.io构建一个应用程序,以将一些html对象共享给连接到房间的所有用户。但是用户会在一段时间后自动... 查看详情

如何使用 socket.io 连接两个应用程序

】如何使用socket.io连接两个应用程序【英文标题】:howtoconnecttwoappswithsocket.io【发布时间】:2021-02-1011:45:07【问题描述】:所以我有一个运行良好的electron-express-socket.io应用程序。我现在需要使用("socket.io-client")将EXPO应用程序连... 查看详情

断开连接时销毁socket.io连接

】断开连接时销毁socket.io连接【英文标题】:Destroysocket.ioconnectionwhendisconnect【发布时间】:2016-07-0802:36:30【问题描述】:我遇到了一个问题,即用户从socket.io断开连接并且实例仍然处于活动状态,包括所有事件侦听器。下面的... 查看详情

socket.io 官方客户端连接问题?

】socket.io官方客户端连接问题?【英文标题】:socket.ioofficialclientconnectionissues?【发布时间】:2015-06-2119:51:46【问题描述】:我正在使用iOS8和Swift。我想使用官方的socket.io客户端,但由于某种原因它没有尝试连接。我按照这里给... 查看详情

Socket.io - 客户端断开连接后手动重新连接

】Socket.io-客户端断开连接后手动重新连接【英文标题】:Socket.io-Manualreconnectafterclient-sidedisconnect【发布时间】:2012-10-1223:41:33【问题描述】:我使用node.js和socket.io创建一个实时网络应用程序。我将让用户完全控制套接字连接,... 查看详情

Socket.io 私信,多用户同时在线

】Socket.io私信,多用户同时在线【英文标题】:Socket.ioPrivatemessaging,withmultipleusersonlineatthesametime【发布时间】:2014-03-1709:51:37【问题描述】:所以我正在构建一个聊天应用程序,并且需要帮助弄清楚如何发送私人消息。这是我的... 查看详情

socket.io 中的连接限制

】socket.io中的连接限制【英文标题】:Connectionlimitinsocket.io【发布时间】:2016-10-2423:09:00【问题描述】:使用带有socket.io的nodejs服务器和客户端,我可以让14k客户端连接。即使在使用集群时也略少。CPU或RAM均未耗尽。除了socket.io... 查看详情

如何在 Socket.IO 中模拟连接失败

】如何在Socket.IO中模拟连接失败【英文标题】:HowtosimulateaconnectionfailureinSocket.IO【发布时间】:2011-11-0521:39:26【问题描述】:我正在开发一个应用程序,其中客户端通过Socket.io连接到nodejs服务器并订阅各种事件。这些订阅相当复... 查看详情