更新了示例代码!
player = {};//注意:来自其他模块,并不是在本文件中定义的。用于保存所有用户的信息
io.sockets.on('connection', function (socket) {
var currentUser = {//获取到的用户数据
uid: 1000,
socket: socket,
};
player[currentUser.uid] = currentUser;//保存用户连接
currentUser.socket.on('login', function() {
currentUser.socket.emit('login_result', 'yes');
});
currentUser.socket.on('test', function() {
currentUser.socket.emit('test_result', 'something');
});
});
在不使用session的情况下,可以用这种方式保存到所有用户的连接。 弊端嘛?人太多,player这个变量会很大很大。。
19 回复
- 应该是不会覆盖的啊
- 当需要浏览器cookie来判断用户身份时,可用handshakeData得到sessionId,而且每个tab页面的socket是不一样的,所以即使userid唯一,也需要一个标识来指明到底消息来自于哪个tab,要发往哪个tab
io.configure(function() {
io.set('transports', [ 'websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling' ]);
io.set('authorization', function(handshakeData, callback) {
// 没有cookie则退出
if (!handshakeData.headers.cookie) {
return callback('no found cookie.', false);
}
var signedCookies = require('express/node_modules/cookie').parse(handshakeData.headers.cookie);
handshakeData.cookies = require('express/node_modules/connect/lib/utils').parseSignedCookies(signedCookies, app.get('config')['session_secret']);
// 根据sessionId找username
sessionStore.get(handshakeData.cookies['sid'], function(err, session) {
if (err || !session)
return callback('no found session.', false);
handshakeData.session = session;
if (handshakeData.session.user) {
return callback(null, true);
}
else {
return callback('no found session.user', false);
}
});
});
});
@jiyinyiyong 我更新了帖子里的示例代码。您看看。
我现在在尝试第2种方式:我由于没有使用session,所以是将每个用户的socket保存在一个全局变量里。然后要给某个人发消息时,通过player[uid].socket.emit(。。。);
@html5solo 每个socket都是独立的,绑定在它上面的事件也只能在你这个连接内触发,你要保存所有进来的socket连接,把它想像成dom事件绑定,想要每个dom事件都触发,那得一个一个emit,这方法比较笨哈^ ^