我正在制作一个简单的聊天应用,通过redis发布/订阅频道发送消息。我不使用任何登录选项只是让用户选择用户名和聊天。我正在尝试实现私人聊天,其中一个客户端能够与另一个连接客户端进行通信。我是新手聊天客户端编程,我试图弄清楚如何只与一个客户端进行通信。我可以考虑哪些选项来获得1对1聊天的能力?我不介意改变我的架构以采用新工具。任何建议表示赞赏
答案 0 :(得分:0)
我使用原始套接字做了类似的事情。我持有包含连接套接字的用户对象,名称以及是否正在聊天。如果用户未在聊天中,则可以键入命令/list users
,该命令提供当前连接的用户列表。当他找到某人聊天时,他输入命令/chat bob
。如果用户bob
已在聊天,他将收到来自服务器的消息,说明bob is in a chat already
。否则,将在两个用户之间建立聊天会话。他们现在将进行聊天,直到其中一人进入/endchat
。然后他们就能找到新人聊天。
技巧是实现服务器,以便它可以跟踪用户列表及其聊天状态以及他们与谁聊天,因此当他们键入/endchat
时,可以通知其他用户。
答案 1 :(得分:0)
我想,Nodejs + Socket.io的组合可以解决你的问题。具体的房间功能是你在这里寻找的。
假设你有两个用户bob和gob。考虑两者都在线(虽然您可以将Redis添加为会话存储并稍后存储历史记录,这是我在我的情况下所做的)。说鲍勃想与他选择gob的gob聊天。现在让鲍勃加入一个房间
var roomname = 'bob'>'gob'?'bob'+'gob':'gob'+'bob' ;
//this type of naming ensures roomname is same for both users
socket.join(roomname);
这只有在两者互相选择的情况下才有效。所以现在当gob选择bob时,两者都加入了同一个房间。每当有人发送消息时,都会使用
将其发送到该房间 socket.broadcast.to(roomname).emit('message_event',msgObj);
确保您已添加了侦听器
socket.on('message_event',messageHandler);
聊天完成后,让他们使用
离开房间socket.leave(roomname);