【问题标题】:Erlang/Mochiweb newbie question abt clients communicationErlang/Mochiweb 新手问题 abt 客户沟通
【发布时间】:2011-10-08 18:52:24
【问题描述】:

每次客户端/浏览器连接到 Mochiweb 服务器,它创建了新的 Loop 进程,不是吗?所以,如果我想 将消息从一个客户端传输到另一个客户端(典型的聊天系统)我 应该使用 Loop 的 self() 来存储所有连接的客户端 PID,不应该 一世?

如果到目前为止有什么(或一切)有问题,请简要解释一下 系统正常工作,服务器进程在哪里,客户端进程在哪里?

如何使用 PID 向客户端的 Loop 进程发送消息?我的意思是去哪里 将“接收”放在循环中?

【问题讨论】:

    标签: process erlang client mochiweb


    【解决方案1】:

    您可以使用多种数据结构来避免将 PID 用于标识。以 queue() 为例。想象一下,您有一个带有 RAM 表的复制 mnesia 数据库,您在其中为每个用户实现了一个明确唯一可识别的 queue()。与用户保持连接的进程(mochiweb 进程)仅持有该用户会话的身份。然后,它使用此身份定期检查他在 Mnesia 中的 queue() (如果您打算这样 - 只要用户会话保持 mochiweb 进程处于活动状态)。那么这意味着无论用户通过哪个进程PID连接,只要该进程具有用户身份,那么它就可以从他的消息队列()中获取(读取)消息。因此,这将导致用户有可能拥有多个客户端会话。同一进程可以使用此身份将来自该用户的消息转储到其他用户的 queues() 中。

    【讨论】:

      【解决方案2】:

      首先,正确地进行研究。查看 this articlethis onethis last one

      让 mochiweb 进程将聊天数据带入您的其他应用程序服务器(可以是 gen_server、OTP 应用程序中具有许多主管的工作人员、其他分布式工作人员等)。您不应依赖 mochiweb 进程的 PID。有另一种唯一标识您的用户的方法。 Cookie、会话 ID、身份验证令牌等。仅由您的应用程序管理的东西。让 mochiweb 进程在聊天数据可用时立即将其传送到您的服务器。您可以在 mnesia 中进行某种排队,其中每个用户都有一个消息队列,其他用户在其中发布聊天消息。然后 mochiweb 进程不断询问 mnesia 在每个连接处是否有可用的消息供用户使用。总之,这将取决于聊天方法:HTTP Long polling/COMET, REST/Server push/Keep-alive connections blur blur blur....只要保持容错并且不涉及聊天引擎中的 mochiweb 进程,只需让 mochiweb 成为唯一的交通工具,在它背后做你的聊天丛林!

      【讨论】:

      • 感谢清晰简单的语言解释 %) 我看过那些文章,但问题是我还没有开始学习 OTP 库,我才刚刚开始。关于您的回答,我有一个问题:据我所知,mochiweb 应该只关心向目标客户端传递消息,对吗?并且单独的服务器应该关心在许多其他 mochiweb 进程(与连接的客户端数量一样多)中将消息传输到正确的 mochiweb 进程,对吗?那么服务器应该如何在不知道 mochiweb proc 的 PID 的情况下将消息传递到特定的 mochiweb 呢?
      【解决方案3】:

      Here's a good article 关于 Mochiweb 网络聊天的实现。 HTTP 客户端没有 PID,因为 HTTP 是无状态协议。您可以使用 cookie 将请求连接到聊天室的唯一身份访问者。

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 2022-11-02
        • 1970-01-01
        相关资源
        最近更新 更多