提问人:Dan Sosedoff 提问时间:11/13/2009 最后编辑:halferDan Sosedoff 更新时间:10/23/2023 访问量:808
如何管理服务器应用程序中的多个客户端会话?
How to manage multiple client sessions within server application?
问:
我正在编写类似于 GTalk 的网络聊天应用程序。它基于客户端的 Orbited + Sinatra,服务器端的 Ruby。我已经实施了所有协议,一切正常。
但是,如果一个用户有多个连接,我不知道如何处理。例如,我从 2 个不同的浏览器登录聊天。谷歌处理得非常好,两个聊天似乎完全相同。但是我的应用程序只在联系人列表中显示 2 个完全相同的用户,这是不正确的。
下面是服务器客户端池的一个小示例:
Server
--> Connections
|
- Client (User Information, ConnectionID)
- Client (User Information, ConnectionID)
....
- Client (...)
我有 2 种类型的消息:私人(用户到用户)、公共(用户到会议)。
我试图弄清楚如何处理这种情况?有什么建议吗?
答:
很抱歉答案含糊不清,但这里是:您需要将聊天文本“推送”到给定用户 ID 的每个连接,而不仅仅是响应给定连接/会话的“拉取”。
我不知道您的客户端是如何工作的,但是如果它轮询更新,您可能需要在数据库中保存最近消息的每个用户帐户图像,然后从数据库获取该用户的所有相关更新,而不仅仅是将聊天与“点对点”会话相关联。
咕噜咕噜。我现在没有时间更好地解释这一点......
- 更新:-----
为每个对话创建某种“设置”数据结构,以识别所涉及的会话(以及用户),无论是一对一还是大型组。为每个对话制作一个帖子列表,按时间顺序排列,您可以扫描这些帖子以更新每个客户的显示,提供任何尚未查看的帖子。
作为对问题本身的评论的旁白:有人指出“已经完成了”,下载代码。也许这是一个有效的观点,也许不是。如果你能找到一个可以接受和扩展的现有代码库,那就太好了。如果不是(因为这是家庭作业,或者因为公司政策说“从头开始,此时此地”),那么,下载“解决方案”不是一个有效的批评,是吗?
评论
当您的客户端连接时,您应该为他们提供一个唯一的标识符。经典 ASP 有这个功能,但你只需要一些独特的东西,也许通过 cookie 将该密钥发送回客户端。SessionID
之后,客户发送的任何消息都应放在公共区域;同样,在经典的 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
评论
下一个:业务逻辑的服务器端技术
评论