1

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

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

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

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

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

4

2 回答 2

0

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

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

Grr。我现在没有时间更好地解释这个...

        • 更新: - - - - -

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

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

于 2009-11-13T01:26:39.287 回答
0

当您的客户连接时,您应该给他们一个唯一的标识符。经典 ASP 有,SessionID但您只需要一些独特的东西,也许通过 cookie 将该密钥发送回客户端。

之后,客户端发送的任何消息都应该放在一个公共区域;再次在经典 ASP 中,您拥有那些非常Application适合此任务的对象。

从此,您可以去任何地方:实现聊天室、过滤消息、窃窃私语等。

大约 7、8 年前我做过类似的事情,将消息存储在 XML 文件中。但是你也可以使用一些数据库来做到这一点。

作为伪代码,每个 Web 请求都有以下内容:

    如果请求没有 cookie ID
       创建唯一 ID 并设置 cookie

    处理传入动作
       案例“私人”:
            为该唯一 ID 写消息
       案例“公开”
            在没有目标用户的情况下编写消息
       案子 ...

    显示用户界面
        列出您的唯一 ID 或没有目标的所有消息
        创建用户列表,使用唯一 ID 作为值(您的除外)

    每 n 秒刷新一次

于 2009-11-13T01:27:22.797 回答