我正在设计一个聊天脚本,我使用不同的浏览器在我的机器上进行测试。我正在尝试使用 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.js 和http://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 的值在两个浏览器中往往相同...并且该值会自动更改,我不知道为什么存在...我想在节点的早期版本中它那样工作。