我有一个牛仔的WebSocket服务器。许多客户通过websocket发送消息。我需要对消息进行处理。我能做到这一点在websocket_handle,但是因为它是实时的,我想避开它,而不是我想将消息发送到全球的过程,其中可以完成所有的处理。牛仔的WebSocket全球处理
由于每个牛仔都有它自己的进程如何运行的过程,每一个用户可以发送消息和处理可以在这一过程中来完成。
我有一个牛仔的WebSocket服务器。许多客户通过websocket发送消息。我需要对消息进行处理。我能做到这一点在websocket_handle,但是因为它是实时的,我想避开它,而不是我想将消息发送到全球的过程,其中可以完成所有的处理。牛仔的WebSocket全球处理
由于每个牛仔都有它自己的进程如何运行的过程,每一个用户可以发送消息和处理可以在这一过程中来完成。
只是为了澄清,每个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
全局名称。
感谢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,[ “应用/兔子”]}。 –
得到它的工作!忘了在启动脚本中添加目录路径:) –