Erlang正在注册客户端进程

Erlang正在注册客户端进程,erlang,Erlang,所以我的目标是首先启动一个客户机流程。然后可以将其注册到指定的服务器。分两步完成 我最初创建的客户端/服务器进程如下: startServer() -> register(chat, spawn(chat, loop, [[], []])). startClient() -> register(clientPid, spawn(chat, client, [undefined, undefined])). 这将运行客户端循环: client(Server, Username) -&

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

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

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()调用一定有问题。由于服务器和用户名在创建时是未知的,因此我不确定将什么传递到客户端进程。任何帮助都会很棒。我希望这一切都有意义

My reply()函数也是:

 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.
这一行:

\->clientPid!{在线,服务器,用户名}

应该是:

ClientPID->ClientPID!{在线,服务器,用户名}

whereis
提供向atom注册的PID


您所做的是将消息发送到atom
clientPid
,而不是发送到此atom注册的PID。

我现在无法测试它,但为什么clientPid与注册atom的PID相对应?我从未创建过变量ClientPID。我对erlang非常陌生,所以这可能是一个愚蠢的问题。
ClientPID
是一个变量。您需要阅读有关erlang中原子与变量的信息