使用Node.js、Socket.io和Redis创建的一对一聊天应用程序

7

我目前在使用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进行一对一聊天的示例,但我找不到一个只能向所有用户发送消息的示例。这是我查看过的其中一个示例:

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);
});

});
1个回答

2

你必须在专用用户通道上发布。我认为没有其他方法。但不要担心,发布/订阅通道是易失性的,所以应该可以很好地工作。

不要将消息发布到聊天,而是发布到聊天.用户名,并订阅两者。

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);
    });
});

嗨,看了你的代码后,我试着修改了一下。我已经添加了上面的代码。但是这段代码会将消息发送给所有人,而不是个别人。你可以在这里检查应用程序的结果 https://smartican.com/ajax/redis.html - user3455531
如何让一个用户名订阅一个频道? - user3455531
这段代码让用户订阅他的频道和全局频道。你需要更改代码,例如要发送的消息可以带有与之交谈的其他用户的ID,我会更改代码。如果用户1向用户2发送消息,在这段代码中用户3不应该收到它,但每个用户都会收到登录和注销消息。 - Philippe T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接