gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:57:20 25 4
gpt4 key购买 nike

我正在设计一个聊天脚本,我在我的机器上使用不同的浏览器对其进行了测试。我正在尝试使用 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 中用户对象的内容时......信息已经过时并且不会显示与当我询问哪些是兄弟 A 中的对象的内容时相同的结果,即使我正在尝试对无效性进行一些检查以在用户为空时存储 vals --> if( ( users .hasOwnProperty(req.session.name) === false))。基本上,我需要的是一种将每个套接字资源存储在具有标识符(req.session.name) 并让这样的容器可用于所有浏览器中的所有 session ,因此当服务器从浏览器 A 接收到浏览器 B 的消息时,它可以识别它并向浏览器 B 发出响应。

我从 https://github.com/generalhenry/specificUser/blob/master/app.js 得到了我想要的东西的想法和 http://chrissilich.com/blog/socket-io-0-7-sending-messages-to-individual-clients/

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

最佳答案

问题是 socket.id 识别套接字,而不是用户,所以如果一个用户同时打开多个选项卡,每个选项卡都会有不同的 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
}

关于node.js - 如何使用 socket.io 存储来自特定用户的套接字资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14048873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com