所以我的目标是首先启动客户端流程。然后能够将其注册到指定的服务器。分两步完成。
我最初创建我的客户端/服务器进程如下:
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.
答案 0 :(得分:0)
这一行:
_ -> clientPid ! {online, Server, Username}
应该是:
ClientPID -> ClientPID ! {online, Server, Username}
whereis
为您提供在原子中注册的PID。
您正在做的是向原子clientPid
发送消息,而不是向使用此原子注册的PID发送消息。