在牛仔 websocket 处理程序中使用 gproc 注册两个本地进程时出现问题

Posted

技术标签:

【中文标题】在牛仔 websocket 处理程序中使用 gproc 注册两个本地进程时出现问题【英文标题】:Issue when registering two local process with gproc within cowboy websocket handler 【发布时间】:2017-06-16 18:08:24 【问题描述】:

我尝试在牛仔 websocket 处理程序下使用 gproc 注册一堆具有唯一姓氏的进程。 在我的处理程序中,我创建了两个方法,第一个是处理注册:

websocket_handle(text, <<"Reg: ",Message/binary>>, State) ->
io:format("Client ~p requesting to register ~n",[Message]),
MyPID=list_to_binary(pid_to_list(self())),
[_,Family]=jiffy:decode(Message),
io:format("Client ~p requesting to register ~n",[Family]),
Test = gproc:reg(p, l, Family),
erlang:display(Test),
io:format("Registration OK, replying ..."),
Result =  gproc:lookup_pids(p, l, Family),
erlang:display(Result),
[PID] = Result,
io:format("PASS  ~n"),
io:format("PID ~p FORMATTED ~n",[PID]),
Res= list_to_binary(pid_to_list(PID)),
\"inform\",\"From\" : \"Server\",\"Message\" : \"How you are doing !\"">>),
reply, text,<<"\"Type\" : \"fb_server\",\"Action\" : \"registration\",\"From\" : \"Server\",\"Message\" : \"",Res/binary,"\"">>, State;

第二个是处理pis的恢复:

websocket_handle(text, <<"Get: ",Message/binary>>, State) ->
io:format("Client ~p requesting Pids ~n",[Message]),
[_,Family]=jiffy:decode(Message),

Result =  gproc:lookup_pids(p, l, Family),
erlang:display(Result),
if 
    Result == [] ->
       reply, text,<<"\"Type\" : \"fb_server\",\"Action\" : \"Get Pids\",\"From\" : \"Server\",\"Message\" : \"Empty list\"">>, State;
    true ->
       [PID] = Result,
       io:format("PASS  ~n"),
       io:format("PID ~p FORMATTED ~n",[PID]),
       Res= list_to_binary(pid_to_list(PID)),
      \"fb_server\",\"Action\" : \"inform\",\"From\" : \"Server\",\"Message\" : \"How you are doing !\"">>),
      reply, text,<<"\"Type\" : \"fb_server\",\"Action\" : \"Get Pids\",\"From\" : \"Server\",\"Message\" : \"",Res/binary,"\"">>, State
end.

为了测试我的处理程序我创建了两个js文件,第一个是注册一个进程族,我启动注册请求如下:

 writeToScreen("CONNECTED");
var msg = family: "Js";  
websocket.send("Reg: "+JSON.stringify(msg) );

第二个测试文件是获取第一个文件已经注册的进程的pid:

function onOpen(evt)

//ON opening connection we will send a getPids request to get pids of                 processes registered under Family "Js" 
writeToScreen("CONNECTED");
var msg = family: "Js";
//websocket.send("Reg: "+JSON.stringify(msg) );
 getPids(msg);
//doSend("WebSocket rocks");

function getPids(msg)

writeToScreen("get Pids");
websocket.send("Get: "+JSON.stringify(msg) );

我的问题是第一个文件成功注册了进程,但是第二个文件得到了一个空列表,基本上它应该得到一个列表,其中包含第一个文件已经创建的 pid ??

最好的问候。

【问题讨论】:

当你连接第二个客户端时,你确定第一个 websocket 仍然打开吗?如果第一个客户端关闭套接字,则处理该 websocket 的 erlang 进程将被终止,并且 pid 将自动从 gproc 注册表中删除。 【参考方案1】:

@Stefan Zobel,你说得对,在我的 onmessage 事件中,我调用了 onclose() 事件。

【讨论】:

以上是关于在牛仔 websocket 处理程序中使用 gproc 注册两个本地进程时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

牛仔在端口 80 上丢弃一些数据包

Cowboy:你如何呈现来自处理程序的静态 html 文件?

无法使用托管在 GPR 上的私有 NPM 包

设计mips32cpu时,运算指令溢出怎么处理

使用牛仔示例启动应用程序时出错('noproc',ranch_listener_sup)

在调用处理程序之前使用 Tomcat 8 和 Spring 4 ClassCastException 的 websockets