在阿里其他的东西没学会,但踩坑填坑的手艺却是大有长进。
这两天在搞一个聊天工具,其中用到了Socket.io这个库。这个库给我的印象其实一直都是非常好的。这个家伙的Websocket封装做的很不错,给开发带来了很大的便利。
昨天脑洞大开想在Server端加上一个Redis的消息队列。这样的话,如果有新的Connection连接进来,Server就可以向他推送近期的消息了。
当然,储存消息的方式不难。我直接用来Redis的Hash存储,这种方式比较适合存储像消息体这样的对象类型。
之后我在监听Login事件的监听器中加上了emit广播,测试了和Redis的连接。
由于不能每进来一个新连接Server都去广播一次,这样很影响用户体验。所以我打算做成单播的形式,只给新加入的Connection推送最近的消息。
于是按照Socket.io的Doc:
// send to current request socket client
socket.emit('message', "this is a test");
// sending to all clients except sender
socket.broadcast.emit('message', "this is a test");
// sending to all clients in 'game' room(channel) except sender
socket.broadcast.to('game').emit('message', 'nice game');
// sending to all clients, include sender
io.sockets.emit('message', "this is a test");
// sending to all clients in 'game' room(channel), include sender
io.sockets.in('game').emit('message', 'cool game');
// sending to individual socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');
我爽爽的Debug了两个小时,最后还是在stackoverflow上找到了答案。从1.0.0的版本之后,Sockets变成一个list数组了,所以调用姿势变成了这个样子:
//向新加入的用户推送之前的消息 io.sockets.connected[socket.id].emit('message', {userid:reply.id, username:reply.name, content:reply.content});
简直2333有木有?其实这不是一个大问题,但是网上的教程基本都是1.0.0版本之前的,所以很多教程使用的是现在已经不再兼容的方法。
希望我能成为萝卜,为你填掉这个坑。