Erlang 在cowboy websocket处理程序中向gproc注册两个本地进程时出现问题

Erlang 在cowboy websocket处理程序中向gproc注册两个本地进程时出现问题,erlang,otp,cowboy,Erlang,Otp,Cowboy,我尝试在一个牛仔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()

我尝试在一个牛仔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};
第二个测试文件是获取第一个文件已经注册的进程的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已经由第一个文件创建


向您致意。

@Stefan Zobel,您是对的,在我的onmessage事件中我调用了onclose()事件。

@Stefan Zobel,您是对的,在我的onmessage事件中我调用了onclose()事件。

您确定在连接第二个客户端时第一个websocket仍然打开吗?如果第一个客户端关闭套接字,则erlang进程将停止处理websocket,并且pid将自动从gproc注册表中删除。您确定在连接第二个客户端时第一个websocket仍处于打开状态吗?如果第一个客户端关闭了套接字,那么处理websocket的erlang进程将被终止,pid将自动从gproc注册表中删除。
 writeToScreen("CONNECTED");
var msg = {family: "Js"};  
websocket.send("Reg: "+JSON.stringify(msg) );
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) );
}