第二个方案
和上个区别在于服务器得到消息后主动推送给对应客户端。
实现就是redis 订阅事件,监听message,得到发布后分析,推送给指定链接的userid。
服务器区别代码:
var redis_socket_sub=require('./redis_socket_sub.js')
//注册 订阅事件 用switch 分别事件
redis_socket_sub.init_sub(function(type,message){
switch(type){
case "message_pub":
msg();
break;
}
function msg(){
var arr=message.split(':');
//console.log(user)
if(arr.length>1){
//console.log(users);
var user=users[arr[0]]
if(user && user.emit){
//console.log(users[user[0]]);
console.log('userid:',arr[0],'存在')
user.emit('message',{type:1,action:'message_number',
data:arr[1]})
}
}
}
});
在链接上后并获取了user信息后添加到
users[socket.user.id]=socket;
在断开后:
socket.on('disconnect',function(){
if(socket.user){
users[socket.user.id]=null;
}
//console.log('user',users)
console.log('close')
})
redis_socket_sub.js:
var redis = require('redis');
var client = redis.createClient('6379', '127.0.0.1');
//在ready回调内订阅message_pub
client.on('ready',function(){
//订阅消息
client.subscribe('message_pub',function(type){
console.log('message_pub success ')
});
})
//订阅消息事件
exports.init_sub=function(call){
client.on("message", function (channel, message) {
console.log("channel="+channel+";message=" + message);
call(channel,message)
});
}
订阅消息,message 监听内调用回调call.
1、回调接收的值 也就是publish key value 时value的值是有要求的。
它的传递都是字符串,如果传递的是对象json 写法需要特别注意:
publish "rmcc" '{"type":"1","userId":"1","value":"3"}'
一般的json中数字是不需要加双引号的,但是redis中需要加上。
这样回调里才可用JSON.parse(message)来解析成对象。
2、还有订阅和查询的redis 分别开两个redis.createClient
写在同一个链接上会出问题。