2013-06-04 61 views
0

我有一个牛仔的WebSocket服务器。许多客户通过websocket发送消息。我需要对消息进行处理。我能做到这一点在websocket_handle,但是因为它是实时的,我想避开它,而不是我想将消息发送到全球的过程,其中可以完成所有的处理。牛仔的WebSocket全球处理

由于每个牛仔都有它自己的进程如何运行的过程,每一个用户可以发送消息和处理可以在这一过程中来完成。

回答

3

只是为了澄清,每个WebSocket连接将在牛仔它自己的Erlang进程,所以从不同的WebSocket客户消息将在不同进程进行处理。

如果您需要从WebSocket的移动处理,你可以简单地启动一个新的处理程序/服务器的过程,当你启动应用程序(例如,当您启动牛仔)侦听程序指令和数据。示例处理代码:

-module(my_processor). 

-export([start/0]). 

start() -> 
    spawn(fun process_loop/0). 

process_loop() -> 
    receive 
    {process_cmd, Data} -> 
     process(Data) 
    end, 
    process_loop(). 

当您启动它时,还用全局名称注册进程。这样我们可以稍后从websocket处理程序中引用它。

Pid=my_processor:start(). 
register(processor, Pid). 

现在你可以从牛仔的websocket_handle/3功能发送的数据的处理过程:

websocket_handle(Data, Req, State) -> 
     ..., 
     processor ! {process_cmd, Data}, 
     ..., 
     {ok,Req,State}. 

注意,my_processor进程将处理来自所有连接的处理请求。如果您希望为每个websocket连接分别创建一个进程,您可以在Cowboy的websocket_init/3函数中启动my_processor,将my_processor进程的Pid存储在从websocket_init返回的State参数中,并使用该pid而不是processor全局名称。

+0

感谢johlo ..那是什么我已经开始工作。实际上,因为要求有点复杂,我在我的主应用程序中创建了一个单独的应用程序..所以我创建了一个myapp文件夹,里面保存了应用程序文件和模块文件。我可以使用rebar编译它们,但是当我启动服务器时出现以下错误: - {“init终止于do_boot”,{{badmatch,{error,{“no such file or directory”,“rabbit.app”}}}, [{的WebSocket,启动,0,[{文件, “SRC/websocket.erl”},{线,14}]},{INIT,start_it,1,[]},{INIT,start_em,1,[]} ]}}在rebar.config我已成立{sub_dirs,[ “应用/兔子”]}。 –

+0

得到它的工作!忘了在启动脚本中添加目录路径:) –