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