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

mspsb9vt  于 11个月前  发布在  Ruby
关注(0)|答案(2)|浏览(113)

我写的网络聊天应用程序,类似于GTalk。它基于轨道+ Sinatra的客户端,和Ruby的服务器端。我已经实现了所有的协议,一切工作正常。
但是,我不知道如何处理,如果有来自一个用户的多个连接.举个例子,我登录到聊天从2个不同的浏览器.谷歌处理这真的很好,两个聊天似乎是完全相同的.但我的应用程序只是显示2完全相同的用户在联系人列表中,这是不正确的.
下面是一个服务器客户端池的小例子:

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

字符串
我有两种类型的消息:私人(用户对用户),公共(用户对会议)。
我在想该怎么处理这种情况?有什么建议吗?

zpf6vheq

zpf6vheq1#

很抱歉我的回答很模糊,但这里是这样的:你需要为给定的用户ID将聊天文本“推送”到每个连接,而不仅仅是响应来自给定连接/会话的“拉取”。
我不知道你的客户端是如何工作的,但是如果它轮询更新,你可能需要在数据库中保存每个用户帐户的最近消息图像,然后从数据库中获取该用户的所有相关更新,而不仅仅是将聊天与“点对点”会话相关联。
呃。我没时间解释了...

    • 更新:-

为每个对话建立某种“集合”数据结构,标识所涉及的会话(以及用户),无论是一对一的还是一个大的组。为每个对话建立一个帖子列表,按时间顺序排列,您可以扫描以更新每个客户端的显示,提供任何尚未查看的帖子。
作为对问题本身的评论的旁白:有人说“已经完成了”,下载代码。也许这是一个有效的观点,也许不是。如果你能找到一个可以接受和扩展的现有代码库,那就太好了。如果不是(因为这是家庭作业,或者因为公司政策说“从零开始,现在就做”,那么,下载一个“解决方案”不是一个有效的批评,是吗?

xxslljrj

xxslljrj2#

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

字符串

相关问题