4

我正在设计一个聊天脚本,我使用不同的浏览器在我的机器上进行测试。我正在尝试使用 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((用户.hasOwnProperty(req.session.name) === false))。基本上,我需要的是一种将每个套接字资源存储在具有标识符(req.session.name) 并让所有浏览器中的所有会话都可以使用这样的容器,因此当服务器从浏览器 A 接收到浏览器 B 的消息时,它可以识别它并向浏览器 B 发出响应。

我从https://github.com/generalhenry/specificUser/blob/master/app.jshttp://chrissilich.com/blog/socket-io-0-7-sending-了解到我想要什么给个人客户的消息/

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

4

1 回答 1

12

问题是socket.id标识的是sockets,而不是用户,所以如果一个用户同时打开了几个标签,每个标签都会有不同的socket.id,所以如果你只为一个用户存储一个socket.id,每次你分配它,你覆盖以前的socketid。

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

作为一般规则,请记住您管理 CONNECTIONS 而不是 USERS ...一个用户可以拥有多个连接!

连接时

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
}
于 2013-01-28T11:53:53.473 回答