如何在服务器应用程序中管理多个客户端会话

时间:2009-11-13 01:20:11

标签: ruby network-programming server-side

我正在编写网络聊天应用程序,类似于GTalk。它基于Orbited + Sinatra用于客户端,Ruby用于服务器端。我已经实现了所有协议,一切正常。但。我遇到了一个问题 - 如果一个用户有多个连接,就不知道如何处理。比如说,我从2个不同的浏览器登录聊天。谷歌处理得非常好,两个聊天似乎完全一样。但我的应用程序只是在联系人列表中显示2个完全相同的用户,这是不正确的。

以下是服务器客户端池的一个小示例:

Server
--> Connections
      |
      - Client (User Information, ConnectionID)
      - Client (User Information, ConnectionID)
      ....
      - Client (...)

我有两种类型的消息:私人(用户对用户),公共(用户对会议)。

我想弄清楚如何处理这种情况?有什么建议?

2 个答案:

答案 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