使用 node.js、socket.io 和 redis 的一对一聊天应用程序

Posted

技术标签:

【中文标题】使用 node.js、socket.io 和 redis 的一对一聊天应用程序【英文标题】:one to one chat app with node.js, socket.io and redis 【发布时间】:2014-10-18 10:54:16 【问题描述】:

我目前在 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);
);

);

【问题讨论】:

【参考方案1】:

您必须在专用的用户频道上发布。我认为没有其他办法。但别担心,发布/订阅频道是不稳定的,所以应该可以正常工作。

不要发布到 chatting,而是在 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);
    );
);

【讨论】:

嗨..查看您的代码后,我尝试更改代码。我已经添加了上面的代码。但是此代码将消息发送给每个人,而不是个人。你可以在这里查看生成的应用程序smartican.com/ajax/redis.html 如何让一个用户名订阅一个频道? 此代码用户订阅他的频道和全球频道。您必须更改代码,例如要发送的消息可以具有要与之交谈的其他用户的 ID,我更改了代码。如果 user1 向 user2 发送消息,在此代码中 user3 不应该收到它,但每个用户都会收到登录和注销消息

以上是关于使用 node.js、socket.io 和 redis 的一对一聊天应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 使用 socket.io 进行重构

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用

Node.js、多线程和 Socket.io

Socket.io 使用 node.js,根本没有 express?

node.js、socket.io 和 SSL

node.js + socket.io:拍卖网站开发