2015-10-19 4 views
0

Я новичок в Redis Pub/sub, поэтому, пожалуйста, несите меня. Я пытаюсь создать IRC, где пользователи могут создавать свои собственные чаты, похожие на Gitter. Ниже я сделал то, что сделал до сих пор. Я подписываю пользователей на разные каналы по имени пользователя только для тестирования. Дело в том, что, когда я публикую на канале x, клиент, который подключен к каналу y, все равно получает то же самое сообщение. Я публикую команды redis-cli и PUBLISH.Redis Pub/Sub ChatRooms

function handleIO(socket){ 
    function disconnect(){ 
     console.log("Client disconnected"); 
     socket.broadcast.emit("user d/c", socket.username+" has left!"); 
    } 

    socket.on("new user", function(username){ 
     socket.username = username; 

     if(socket.username == "chat"){ 
      redisClient.subscribe("chat"); 
     }else{ 
      redisClient.subscribe("other"); 
     } 

     socket.userColor = '#'+(Math.random()*0xFFFFFF<<0).toString(16); 
     socket.emit("new_user", username); 

     emitter.lrange("messages", 0, -1, function(err, messages){ 
      //reversing to be in correct order 
      messages = messages.reverse(); 

      messages.forEach(function(message){ 
       message = JSON.parse(message); 
       socket.emit("messages", message); 
      }); 
     }); 

     socket.broadcast.emit("user connection", username+" has connected to the Haven!"); 
    }); 
    socket.on("disconnect", disconnect); 

    socket.on("send", function(msg){ 
     var msg = JSON.stringify({ name: socket.username, messageText: msg, color: socket.userColor }); 

     emitter.lpush("messages", msg, function(err, response){ 
      //keep newest 10 items 
      emitter.ltrim("messages", 0, 9); 
     }); 
     io.sockets.emit("receive", msg, socket.userColor); 
    }); 
    redisClient.on("message", function (channel, message) { 
     console.log(channel+":"+message); 
     socket.emit("message", channel, message); 
    }); 

} 

ответ

1

Для потерянного странника там ... То, что я сделал это реализовать еще одно событие на клиенте, чтобы в основном проверить, что клиент «под названием» к сообщению (т.е. принадлежит ли канал данного сообщения в списке клиента субболочных каналов, если это имеет смысл).

стороне клиента

socket.on("message", function(channel, message){ 
    socket.emit("entitled", channel, message); 
}); 

socket.on("entitled", function(reply, channel, message){ 
    if(reply == 1){ 
      $("#msgArea").append(message+"<br/>"); 
      $("#msgArea").prop({ scrollTop: $("#msgArea").prop("scrollHeight") });  
    } 
}); 

Серверный

socket.on("entitled", function(channel, message){ 
    //check that user is subbed 
    emitter.sismember('channels:'+socket.username, channel, function(err, reply){ 
     if(err) throw err; 
     socket.emit("entitled", reply, channel, message); 
    }); 
}); 

То, что я умышленно не в том, что я не продолжать использовать socket.username но начал использовать сеансы для персистенции .. Честное слово совет будет придерживаться магазина redis, поскольку он является одним из самых популярных на github.

Смежные вопросы