我写的网络聊天应用程序,类似于GTalk。它基于轨道+ Sinatra的客户端,和Ruby的服务器端。我已经实现了所有的协议,一切工作正常。
但是,我不知道如何处理,如果有来自一个用户的多个连接.举个例子,我登录到聊天从2个不同的浏览器.谷歌处理这真的很好,两个聊天似乎是完全相同的.但我的应用程序只是显示2完全相同的用户在联系人列表中,这是不正确的.
下面是一个服务器客户端池的小例子:
Server
--> Connections
|
- Client (User Information, ConnectionID)
- Client (User Information, ConnectionID)
....
- Client (...)
字符串
我有两种类型的消息:私人(用户对用户),公共(用户对会议)。
我在想该怎么处理这种情况?有什么建议吗?
2条答案
按热度按时间zpf6vheq1#
很抱歉我的回答很模糊,但这里是这样的:你需要为给定的用户ID将聊天文本“推送”到每个连接,而不仅仅是响应来自给定连接/会话的“拉取”。
我不知道你的客户端是如何工作的,但是如果它轮询更新,你可能需要在数据库中保存每个用户帐户的最近消息图像,然后从数据库中获取该用户的所有相关更新,而不仅仅是将聊天与“点对点”会话相关联。
呃。我没时间解释了...
为每个对话建立某种“集合”数据结构,标识所涉及的会话(以及用户),无论是一对一的还是一个大的组。为每个对话建立一个帖子列表,按时间顺序排列,您可以扫描以更新每个客户端的显示,提供任何尚未查看的帖子。
作为对问题本身的评论的旁白:有人说“已经完成了”,下载代码。也许这是一个有效的观点,也许不是。如果你能找到一个可以接受和扩展的现有代码库,那就太好了。如果不是(因为这是家庭作业,或者因为公司政策说“从零开始,现在就做”,那么,下载一个“解决方案”不是一个有效的批评,是吗?
xxslljrj2#
当你的客户端连接时,你应该给他们给予一个唯一的标识符。经典的ASP有那个
SessionID
,但你只需要一些唯一的东西,也许通过一个cookie把那个密钥发送回客户端。之后,客户端发送的任何消息都应该放在一个公共区域;同样,在经典ASP中,您有
Application
对象,非常适合此任务。从这个,你可以去任何地方:实现聊天室,过滤消息,耳语的东西,等等。
我在7、8年前做过类似的事情,将消息存储在XML文件中,但你也可以使用一些数据库来做到这一点。
作为伪代码,您将为每个Web请求提供以下内容:
字符串