每次客户端/浏览器连接到 Mochiweb 服务器时,它都会创建新的 Loop 进程,不是吗?所以,如果我想将消息从一个客户端传输到另一个(典型的聊天系统),我应该使用 Loop 的 self() 来存储所有连接的客户端 PID,不是吗?
如果到目前为止有什么(或一切)有问题,请简要解释一下系统是如何工作的,服务器进程在哪里,客户端进程在哪里?
如何使用其 PID 向客户端的 Loop 进程发送消息?我的意思是在哪里将“接收”放在循环中?
这是一篇关于 Mochiweb 网络聊天实现的好文章。HTTP 客户端没有 PID,因为 HTTP 是无状态协议。您可以使用 cookie 将请求连接到聊天室的唯一访问者。
首先,做正确的研究。看看这篇文章,这篇文章,然后是最后一篇。
让 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 ....
您可以使用多种数据结构来避免将 PID 用于标识。以 queue() 为例。想象一下,您有一个带有 RAM 表的复制 mnesia 数据库,您在其中为每个用户实现了一个明确唯一可识别的 queue()。与用户保持连接的进程(mochiweb 进程)仅持有该用户会话的身份。然后,它使用此身份定期检查他在 Mnesia 中的 queue() (如果您打算这样 - 只要用户会话保持 mochiweb 进程处于活动状态)。那么这意味着无论用户通过哪个进程PID连接,只要该进程具有用户身份,那么它就可以从他的消息队列()中获取(读取)消息。因此,这将导致用户有可能拥有多个客户端会话。