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

How to manage multiple client sessions within server application?

提问人:Dan Sosedoff 提问时间:11/13/2009 最后编辑:halferDan Sosedoff 更新时间:10/23/2023 访问量:808

问:

我正在编写类似于 GTalk 的网络聊天应用程序。它基于客户端的 Orbited + Sinatra,服务器端的 Ruby。我已经实施了所有协议,一切正常。

但是,如果一个用户有多个连接,我不知道如何处理。例如,我从 2 个不同的浏览器登录聊天。谷歌处理得非常好,两个聊天似乎完全相同。但是我的应用程序只在联系人列表中显示 2 个完全相同的用户,这是不正确的。

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

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

我有 2 种类型的消息:私人(用户到用户)、公共(用户到会议)。

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

Ruby 网络编程 服务器端

评论

0赞 johannes 11/13/2009
你正在重新发明轮子。XMPP 是即时消息传递的标准。有许多免费的实现。Google Talk 只是 XMPP 的另一种实现。XMPP 是模块化的,因此您可以将自己的需求放入协议中,而不会破坏它。

答:

0赞 Roboprog 11/13/2009 #1

很抱歉答案含糊不清,但这里是:您需要将聊天文本“推送”到给定用户 ID 的每个连接,而不仅仅是响应给定连接/会话的“拉取”。

我不知道您的客户端是如何工作的,但是如果它轮询更新,您可能需要在数据库中保存最近消息的每个用户帐户图像,然后从数据库获取该用户的所有相关更新,而不仅仅是将聊天与“点对点”会话相关联。

咕噜咕噜。我现在没有时间更好地解释这一点......

        • 更新:-----

为每个对话创建某种“设置”数据结构,以识别所涉及的会话(以及用户),无论是一对一还是大型组。为每个对话制作一个帖子列表,按时间顺序排列,您可以扫描这些帖子以更新每个客户的显示,提供任何尚未查看的帖子。

作为对问题本身的评论的旁白:有人指出“已经完成了”,下载代码。也许这是一个有效的观点,也许不是。如果你能找到一个可以接受和扩展的现有代码库,那就太好了。如果不是(因为这是家庭作业,或者因为公司政策说“从头开始,此时此地”),那么,下载“解决方案”不是一个有效的批评,是吗?

评论

0赞 Dan Sosedoff 11/13/2009
好的,我已经在使用服务器推送方法。问题是 - 当您使用您的帐户从不同的浏览器选项卡登录聊天时 - 它会在服务器上创建具有相同用户的另一个连接,因此聊天列表中有 2 个或更多相同的用户。我无法找出为具有多个连接的用户分配会话池的最佳方法。
0赞 Rubens Farias 11/13/2009 #2

当您的客户端连接时,您应该为他们提供一个唯一的标识符。经典 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

评论

0赞 Dan Sosedoff 11/13/2009
不,我明白了。但是,如果您使用同一帐户从不同位置登录聊天应用程序,您将收到自己的消息。右?或者我只是没有看到为每个连接保留 uniq id 的想法。
0赞 Rubens Farias 11/13/2009
您不会收到来自自己的消息,因为第二个连接将具有另一个唯一的 ID。