приложение для чата один на один с node.js, socket.io и redis

В настоящее время у меня есть приложение чата (один к одному) в node.js и socket.io. поскольку количество пользователей на моем веб-сайте увеличивается, я хочу добавить Redis в свое приложение для чата. Вот небольшой пример моего текущего приложения:

// all requires and connections
io.sockets.on('connection', function(socket) {

socket.on('message', function(msg) {
// code to get receiverssocket 
io.sockets.sockets[receiverssocket].emit('message',
{"source": msg.sendersusername,"msg": msg.msg});

});

});

Теперь я пытаюсь найти примеры того, как это сделать с помощью Redis, но я не могу найти пример чатов один на один с Redis. я могу найти только примеры, в которых сообщения отправляются всем пользователям. Вот один из примеров, которые я смотрел

http://garydengblog.wordpress.com/2013/06/28/simple-chat-application-using-redis-socket-io-and-node-js/

Один из способов сделать это, как я думал, состоял в том, чтобы создать каналы для каждого пользователя, получающего сообщения, но это привело бы к тысячам каналов. Любая помощь в том, как я могу это сделать?

Изменить: добавлен код

io.sockets.on('connection', function (client) {

sub.on("message", function (channel, message) {
console.log("message received on server from publish ");
client.send(message);
});
client.on("message", function (msg) {
console.log(msg);
if(msg.type == "chat"){
    pub.publish("chatting." + msg.tousername,msg.message);
}
else if(msg.type == "setUsername"){
  sub.subscribe("chatting." + msg.user);
  sub.subscribe("chatting.all" );
  pub.publish("chatting.all","A new user in connected:" + msg.user);
  store.sadd("onlineUsers",msg.user);
}
});
client.on('disconnect', function () {
sub.quit();
pub.publish("chatting.all","User is disconnected :" + client.id);
});

});

person user3455531    schedule 25.08.2014    source источник


Ответы (1)


Вы должны опубликовать на выделенном канале пользователя. Я думаю, что другого пути нет. Но не волнуйтесь, каналы pub/sub нестабильны, так что это должно работать хорошо.

Вместо публикации в чате опубликуйте свое сообщение в chatting.username и подпишитесь на оба.

io.sockets.on('connection', function (client) {

    sub.subscribe("chatting." + client.id);
    sub.subscribe("chatting.all" );

    sub.on("message", function (channel, message) {
        console.log("message received on server from publish ");
        client.send(message);
    });

    client.on("message", function (msg) {
        console.log(msg);
        // supose that msg have a iduserto that is the distant contact id
        if(msg.type == "chat") {
            pub.publish("chatting." + msg.iduserto,msg.message);
        }
        else if(msg.type == "setUsername") {
            pub.publish("chatting.all","A new user in connected:" + msg.user);
            store.sadd("onlineUsers",msg.user);
        }
    });

    client.on('disconnect', function () {
        sub.quit();
        pub.publish("chatting.all","User is disconnected :" + client.id);
    });
});
person Philippe T.    schedule 25.08.2014
comment
Привет .. после просмотра вашего кода я попытался изменить код. я добавил код выше. но этот код отправляет сообщение всем, а не отдельному человеку. вы можете проверить получившееся приложение здесь smartican.com/ajax/redis.html - person user3455531; 25.08.2014
comment
как сделать так, чтобы одно имя пользователя подписывалось на один канал? - person user3455531; 25.08.2014
comment
этим кодом пользователь подписывается на свой канал и на глобальный канал. вам нужно изменить код, например, сообщение для отправки может иметь идентификатор другого пользователя для разговора, я меняю код. если пользователь1 отправляет пользователю2 сообщение, в этом коде пользователь3 не должен его получать, но каждый пользователь получает сообщение о входе в систему и выходе из системы - person Philippe T.; 26.08.2014