我(为了清楚起见)聊了聊。
用户可以登录、写消息,其他人会看到[name]:[message]
.
我不想每次写的时候都发送用户名和IDsocket.emit('say', message);
因为这是多余的,所以我在服务器上做的事情如下:
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?
...
}
那么,此时我该如何获取 userID 呢?
Notes:
- 对于每个登录并连接 Facebook 帐户的用户,客户端都会告诉服务器保存该人的姓名和 ID。
我想过用一个保存用户名和ID的cookie来实现,服务器通过读取cookie就知道是哪个用户,但这是一个有点丑陋的解决方案:每次都发送这些信息是多余的。
我还可以劫持“on”函数(以某种方式)并添加知道它是哪个用户的功能,因为无论如何所有“on”侦听器都必须驻留在“连接”侦听器内。
可能发生的情况是用户连接到您的聊天应用程序,所以这里
io.sockets.on('connection', function (s){
socket = s; // cache for later usage
您将“他的套接字”分配给变量socket
它不受上下文的约束,它是独立的。现在假设第二个用户到达,socket
被重新分配给第二个用户的第二个,但是如果你得到一个savePersonToSocket
然后事件socket
将被使用,这对每个人来说都是相同的,更详细地说,它与最后连接的用户有关。
您无需保留参考s
,当您有很多用户连接到您的应用程序时,您可能必须处理这个问题,但解决方案将与您的方法非常不同。
编辑:另一种方法可以是映射用户 ID 和socket
s:
// 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;
}
所以基本上你是说你不想传递给doSomething
事件负载userID
?因为这对我来说似乎是一个有效的解决方案,它不是多余的,这是让服务器知道它正在处理的用户的最简单方法。其他解决方案可能更优雅,但我怀疑它们是否像这个解决方案一样简单且易于维护。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)