Erlang / Mochiweb新手问题abt客户沟通

时间:2011-07-19 18:17:37

标签: process erlang client mochiweb

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

如果到目前为止某事(或一切)都错了,请简要解释一下 系统工作,服务器进程在哪里,客户端进程在哪里?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

首先,做好你的研究。查看 this article this one ,然后 this last one

让mochiweb进程将聊天数据带入您的其他应用程序服务器(可以是gen_server,OTP应用程序中的工作人员,有许多主管,其他分布式工作人员e.t.c)。您不应该依赖于mochiweb进程的PID。有另一种方法可以唯一识别您的用户。 Cookie,会话ID,Auth令牌e.t.c.只能由您的应用程序管理的东西。让mochiweb流程尽快将聊天数据提供给您的服务器。您可以在mnesia中进行某种排队,其中每个用户都有一个消息队列,其他用户可以在其中发布聊天消息。然后mochiweb进程只是不断询问mnesia是否在每个连接上都有可供用户使用的消息。总之,它将取决于聊天方法:HTTP长轮询/ COMET,REST /服务器推送/保持活动连接模糊模糊模糊....只是保持容错并且不涉及聊天引擎中的mochiweb进程,只是让mochiweb成为唯一的交通工具,并在它后面进行聊天丛林!

答案 2 :(得分:0)

您可以使用多个数据结构来避免使用PID进行标识。以队列()为例。想象一下,你有一个带有RAM Table的复制mnesia数据库,你在其中为每个用户实现了一个清晰唯一可识别的队列()。保持与用户的连接的进程(mochiweb进程)仅保存此用户会话的标识。然后它使用此标识定期检查Mnesia中的队列()(如果您打算这样做 - 只要用户会话保持mochiweb进程活动)。然后,这意味着无论用户通过哪个进程PID连接,只要进程具有用户标识,它就可以从其消息队列()中获取(读取)消息。因此,这将导致用户具有多个客户端会话的可能性。同一进程可以使用此标识将此用户的邮件转储到其他用户的队列()。