多进程运行 node 时,进程间变量不共享,用户请求一个路由后,会由随机的进程来处理。
socket.io 默认使用的内存存储,我们所定义的 socket.io 事件会限制在当前进程。
为了实现多进程 socket.io 的正常使用,就需要一种持久性的存储,socket.io 支持 RedisStore 存储,或者研究下它的接口实现文件存储或者 mongodb 存储之类的。
io.set('store', redisStore);
假如我们使用 RedisStore 存储,当客户端连接后,使用 join 命令把当前连接请进其 username 的房间,这样可以实现即使用户同时打开了 N 个浏览器窗口,都能实时获得通知状态以及实时改变状态。
io.sockets.on('connection',function(socket){// 根据认证握手后的数据,取得用户唯一标识 socket.join(username);});
向客户端发送数据
io.sockets.in(username).emit('notify num', count);
io.sockets.emit('online', username);
后者向所有连接的客户端发送数据,前者只向 username 房间的连接发送数据(包括自己)。
还有一种发送数据的方式是广播(broadcast),给房间内除了自己外的所有连接发送数据。
socket.broadcast.emit("data ....");
不论服务端单进程还是多进程,客户端的代码书写方式都是一样的,这对客户端来说是透明的。