io.on('connection', function(socket){
console.log('a user connected');
//监听新用户加入
socket.on('login', function(obj){
//将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到
socket.name = obj.userid; // 这一句很不明白。
//检查在线列表,如果不在里面就加入
if(!onlineUsers.hasOwnProperty(obj.userid)) {
onlineUsers[obj.userid] = obj.username;
//在线人数+1
onlineCount++;
}
//向所有客户端广播用户加入
io.emit('login', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});
console.log(obj.username+'加入了聊天室');
});
});
第一个问题
上面的代码中:socket.name = obj.userid
这一句很不理解,socket
对象在服务器端不是共享的么,这么写的话岂不是后来的userId
会把前面的覆盖掉么。
还是说socket
是这样工作的,一个user
连接变会复制一份上面的代码,独用,也就是说不是共享的。
第二个问题
io.emit
和socket.emit
有什么区别。我发现有的代码里这两种写法都有呢。
这里的socket是一对一的。
前者是广播。后者是单播。