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中原子与变量的信息