Erlang注册客户端进程

时间:2014-05-09 03:47:47

标签: erlang

所以我的目标是首先启动客户端流程。然后能够将其注册到指定的服务器。分两步完成。

我最初创建我的客户端/服务器进程如下:

startServer() -> register(chat, spawn(chat, loop, [[], []])).
startClient() -> register(clientPid, spawn(chat, client, [undefined, undefined])).

哪个运行客户端循环:

client(Server, Username) ->
receive
    {online, Server, Username} ->
        {chat, Server} ! {self(), online, Username},
        reply();
end,
client(Server, Username).

然后返回我的服务器进程:

loop(Userlist, Chatlist) ->
receive
{From, online, Username} ->
        List = tryGoOnline(From, Username, Userlist),
        loop(List, Chatlist);
end.

然后,用户尝试上线,具体取决于列表中是否注册了相同的名称。

tryGoOnline(From, Username, Userlist) ->
case lists:keymember(Username, 2, Userlist) of
    true ->
        From ! {chat, existing, close, "This username is in use. Please choose a different name."},
        Userlist;
    false ->
        From ! {chat, "You successfully logged online!"},
        [{From, Username} | Userlist]
end.

这是从我的goOnline函数调用的:

goOnline(Username, Server) ->
case whereis(clientPid) of 
    undefined -> "You must register the client first!";
    _ -> clientPid ! {online, Server, Username}   **///PROBLEM HERE!!**
end.

我在goOnline函数中对io:fwrite(" ~p~n",[clientPid])进行了调试,并继续使用' clientPid' ...不是PID id。这导致客户端进程不接收消息,代码停在那里。我的startClient()调用肯定有问题。由于服务器和用户名在创建时未知,我不确定要传递到客户端进程的内容。任何帮助都是极好的。我希望这一切都有道理。

我的回复()功能:

 reply() ->
 receive
    {chat, existing, close, Error} ->
        io:format("~p~n", [Error]),
        exit(existing);
    {chat, close, Error} -> 
        io:format("~p~n", [Error]);
    {chat, NoError} -> 
        io:format("~p~n", [NoError])
end.

1 个答案:

答案 0 :(得分:0)

这一行:

_ -> clientPid ! {online, Server, Username}

应该是:

ClientPID -> ClientPID ! {online, Server, Username}

whereis为您提供在原子中注册的PID。

您正在做的是向原子clientPid发送消息,而不是向使用此原子注册的PID发送消息。

相关问题