gpt4 book ai didi

javascript - 保留对每个用户连接的套接字的引用

转载 作者:数据小太阳 更新时间:2023-10-29 04:44:26 25 4
gpt4 key购买 nike

我有一个(为清楚起见)聊天。

用户可以登录、写消息,其他人将看到[name]:[message]

我不想每次写 socket.emit('say', message); 时都发送用户名和 ID,因为那是多余的,所以我在服务器上做的是这样的:

var io = require("socket.io").listen(server),
sockets = {};

io.sockets.on('connection', function (socket){
socket.on('savePersonToSocket', function(user){
socket.user = user;
sockets[user.id] = socket;
}
socket.on('doSomething', doSomething);
});

// must be outside of 'connection' since I have TONS of these in a much more
//complex structure and I don't want to create them all per user connection.
function doSomething(){
...
sockets[userID].emit('foo'); // how to get the userID at this point?
...
}

那么,那时我该如何获取用户 ID?

注意事项:

  • 对于每个登录并连接到他们的 Facebook 帐户的用户,客户端将告诉服务器保存该人的姓名和 ID。

我想过用保存用户名和 ID 的 cookie 来做,服务器会通过读取 cookie 知道它是哪个用户,但这是一个有点丑陋的解决方案:每次都发送该信息是多余的.

我还可以劫持“on”函数(以某种方式)并添加能够知道它是哪个用户的功能,因为无论如何,所有“on”监听器都必须驻留在“connection”监听器中。

最佳答案

可能发生的情况是用户连接到您的聊天应用程序,所以在这里

io.sockets.on('connection', function (s){
socket = s; // cache for later usage

您将“他的套接字”分配给变量socket,它不受上下文的约束,它是独立的。现在假设第二个用户到达,socket 被重新分配给第二个用户的第二个用户,但是如果您收到 savePersonToSocket 事件,那么 socket 将被使用,这对每个人都是一样的,更详细地说,它与最后一个连接的用户有关。

你不需要保留对s的引用,当你有很多用户连接到你的应用程序时,你可能不得不处理这个问题,但解决方案非常与您的方法不同。

编辑:另一种方法是映射用户 ID 和 socket:

// this assumes that the name of a user is unique
var userSocket = {};

io.sockets.on('connection', function (s){
socket.on('savePersonToSocket', function(user){
userSocket[user.name] = s;
}

所以基本上你是说你不想将 userID 传递给 doSomething 事件负载?因为这对我来说似乎是一个有效的解决方案,它并不冗余,这是让服务器知道它正在处理的用户的最简单方法。其他解决方案可能更优雅,但我怀疑它们是否像这个一样简单且易于维护。

关于javascript - 保留对每个用户连接的套接字的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627225/

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