2017-01-31 1 views
0

Ich habe versucht, eine Reihe von Prozessen mit einem eindeutigen Familiennamen mit gproc unter einem Cowboy WebSocket Handler registrieren. In meinem Handler ich zwei Verfahren erstellt, die erste ist die Registrierung zu behandeln:Problem bei der Registrierung von zwei lokalen Prozess mit gproc innerhalb Cowboy Websocket Handler

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}; 

Die zweite Pis Erholung zu handhaben ist:

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. 

Zu meinem Handler testen Ich habe zwei js Dateien, das erste ist ein Prozess Familie zu registrieren, ich die Registrierungsanfrage starten wie folgt:

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

die zweite Testdatei ist die pid des Prozesses bereits Registe zu erhalten Rot durch die erste Datei:

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)); 
} 

Mein Problem ist, dass die erste Datei erfolgreich den Prozess registrieren, aber die zweiten en leere Liste bekommen, im Grunde sollte es eine Liste mit der pid erhält bereits durch die erste Datei erstellt ??

Mit freundlichen Grüßen.

+0

Sind Sie sicher, dass der erste Websocket noch geöffnet ist, wenn Sie den zweiten Client verbinden? Wenn der erste Client den Socket schließt, wird der Erlang-Prozess, der diesen Websocket behandelt, gelöscht und die PID wird automatisch aus der gproc-Registry entfernt. – johlo

Antwort

0

@Stefan Zobel, Sie haben Recht, In meinem onmessage Ereignis habe ich einen Aufruf zum onclose() Ereignis.

Verwandte Themen