我正在编写网络聊天应用程序,类似于GTalk。它基于Orbited + Sinatra用于客户端,Ruby用于服务器端。我已经实现了所有协议,一切正常。但。我遇到了一个问题 - 如果一个用户有多个连接,就不知道如何处理。比如说,我从2个不同的浏览器登录聊天。谷歌处理得非常好,两个聊天似乎完全一样。但我的应用程序只是在联系人列表中显示2个完全相同的用户,这是不正确的。
以下是服务器客户端池的一个小示例:
Server
--> Connections
|
- Client (User Information, ConnectionID)
- Client (User Information, ConnectionID)
....
- Client (...)
我有两种类型的消息:私人(用户对用户),公共(用户对会议)。
我想弄清楚如何处理这种情况?有什么建议?
答案 0 :(得分:0)
很抱歉这个含糊不清的答案,但是请注意:您需要将聊天文本“推送”到给定用户ID的每个连接,而不仅仅是响应来自给定连接/会话的“拉”。
我不知道您的客户端是如何工作的,但如果它轮询更新,您可能需要在数据库中保存最近消息的每用户帐户映像,然后从数据库获取该用户的所有相关更新,而不只是将聊天与“点对点”会话联系起来。
格儿。我现在没有时间更好地解释这个......
为每个会话创建某种“设置”数据结构,以识别所涉及的会话(以及用户),无论它是一对一还是大组。按时间顺序排列每个对话的帖子列表,您可以扫描这些帖子以更新每个客户的显示,提供任何尚未查看的帖子。
暂不对问题本身发表评论:有人指出“它已经完成”,下载代码。也许这是一个有效的观点,也许不是。如果您可以在表单中找到现有的代码库,那么您可以拥抱和扩展,非常棒。如果不是(因为它是家庭作业,或者因为公司政策说“从头开始,现在就做”,那么,下载“解决方案”不是一个有效的批评,是吗?
答案 1 :(得分:0)
当您的客户连接时,您应该为他们提供唯一标识符。经典ASP有SessionID
,但您只需要一些独特的东西,也许可以通过cookie将该密钥发送回客户端。
之后,客户发送的任何消息都应放在公共区域;再次在经典ASP中你有Application
个对象,非常适合这个任务。
从此,您可以去任何地方:实施聊天室,过滤消息,窃窃私语等等。
我在大约7,8年前做过类似的事情,将消息存储在XML文件中。但你也可以使用一些数据库来做到这一点。
作为伪代码,您将对每个Web请求都有以下内容:
if request DON'T have cookie ID create an unique ID and set cookie process incoming action case "private": write message for that unique id case "public" write message without target user case ... display user interface list all messages for your unique id, or without target create a users list, using unique IDs as value (except yours) refresh every n seconds