如何使用 socket.io 存储来自特定用户的套接字资源?

2023-12-14

我正在设计一个聊天脚本,我使用不同的浏览器在我的机器上测试它。我正在尝试使用 socket.io 向特定用户发送消息,所以这里是:

client:

socket.on('msgFromServer', function (data) {
     message = data['message'],
     from = data['from'],
     to = data['to'];               

    if($('#chatbox.'+from).dialog("isOpen") === true){
        $('#chatbox.'+from+' #messageOutput textarea.readOnly').text(message);      
    }   
    else if(($('#chatbox.'+from).dialog("isOpen") !== true)){
        createChatbox(from,to,message);
    }
});




server:

var users = {};
io.sockets.on('connection', function (socket) {
    if( ( users.hasOwnProperty(req.session.name) === false))
            users[req.session.name] = socket;

    socket.on('msgToServer', function (data) {
         for (var u in users){
              console.log("%s | %s",u,users[u]);
         }      

     });
}); 

好啦,我就讲讲服务端相关的代码结构。它负责存储用户的“连接”事件。当我重新加载页面时,问题就开始了:它将来自浏览器A的用户存储在用户对象中,如果我重新加载并重新连接,它会再次存储,但是当我询问浏览器B中用户对象的内容是什么时......信息已过时,并且与我询问 Broser A 中对象的内容是什么时显示的结果不同,即使我尝试对 nullity 进行一些检查以存储 vals if users 为空 --> if( ( users .hasOwnProperty(req.session.name) === false))。基本上,我需要的是一种将每个套接字资源存储在容器(事实上​​,不一定需要是一个对象)带有标识符(请求会话名称)并且让这样的容器可用于所有浏览器中的所有会话,因此当服务器收到从浏览器 A 到浏览器 B 的消息时,它可以识别该消息并向浏览器 B 发出响应。

我知道我想要什么https://github.com/generalhenry/specialUser/blob/master/app.js and http://chrissilich.com/blog/socket-io-0-7-sending-messages-to-individual-clients/

如果您仔细查看代码...在 chrissilich.com 中,作者指出我们需要存储“socket.id”(users[incoming.phonenumber] = socket.id),而在 git Generalhenry 中我们必须存储存储“socket”(users[myName] = socket)资源。后者是正确的,因为 socket.id 的值在两个浏览器中往往是相同的...并且该值会自动更改,我不知道为什么会存在...我想在节点的早期版本中它就是这样工作的。


问题是socket.id标识的是套接字,而不是用户,所以如果一个用户同时打开多个选项卡,每个选项卡都会有不同的socket.id,所以如果你只为一个用户存储一个socket.id,那么每次你分配它,你覆盖以前的socketid。

因此,除了其他可能的问题之外,至少您需要这样做,否则它将无法工作。我敢打赌,你所说的关于所有浏览器的 1 个套接字是指你每次都会覆盖 id(当我开始使用 Socket.IO 时,这发生在我身上)

作为基本规则,请记住,您管理的是连接而不是用户...一个用户可以有多个连接!

连接时

function onConnection( socket ) {
    var arr = users[incoming.phonenumber] || null;
    if( !arr ) 
        users[incoming.phonenumber] = arr = [];
    if( arr.indexOf( socket.id ) === -1 )
        arr.push( socket.id ); // Assigns socket id to user
}

断开连接时

function onDisconnect( socket ) {
    var arr = users[incoming.phonenumber] || null;
    if( !arr ) return; // Should not happen since an user must connect before being disconnected
    var index = arr.indexOf( socket.id );
    if( index !== -1 )
        arr.splice( index, 1 ); // Removes socket id from user
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 socket.io 存储来自特定用户的套接字资源? 的相关文章

随机推荐