第二個方案
和上個區別在於服務器得到消息後主動推送給對應客戶端。
實現就是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 寫法需要特別注意:
這樣回調裏纔可用JSON.parse(message)來解析成對象。
2、還有訂閱和查詢的redis 分別開兩個redis.createClient
寫在同一個鏈接上會出問題。