查找已注册的进程Erlang
所以我尝试在erlang中的两个客户端和一个服务器之间建立一个聊天系统。 当每个进程上线时,我都会进行注册。但是当一个客户端请求与另一个客户端聊天时,它会进入findUser()函数,并在注册列表中查找目标用户名是否存在。但是由于某些原因,每个客户端用户名并没有被添加到看起来相同的注册列表中。如何使所有新注册的进程进入同一个列表 服务器端: 客户端:查找已注册的进程Erlang,erlang,Erlang,所以我尝试在erlang中的两个客户端和一个服务器之间建立一个聊天系统。 当每个进程上线时,我都会进行注册。但是当一个客户端请求与另一个客户端聊天时,它会进入findUser()函数,并在注册列表中查找目标用户名是否存在。但是由于某些原因,每个客户端用户名并没有被添加到看起来相同的注册列表中。如何使所有新注册的进程进入同一个列表 服务器端: 客户端: 您的userList变量将在checkUser/2结束时销毁,因为Erlang不维护任何类型的全局状态 如果要将列表存储在内存中,则需要某种方式来
您的
userList
变量将在checkUser/2
结束时销毁,因为Erlang不维护任何类型的全局状态
如果要将列表存储在内存中,则需要某种方式来持久化列表。Erlang的内置ets()是一个开始寻找的好地方(还有dets和mnesia)
您还可以在客户端和
checkUser/2
函数之间传递列表。我支持dethtron5000编写的内容,但我想指出,这正是OTP试图解决的问题。您可以将userList
保持在请求之间的状态,并使用来处理实例化和传入消息
-module(hw5server).
-export([start/0, checkUser/2, append/2, findUser/2]).
start() -> spawn(fun loop/0).
findUser(RequestorPid, Receiver) ->
Reqmessage = io:format("~p would like to chat with you. Press 1 to accept or 2 to decline: ", [RequestorPid]),
Pid2 = whereis(erlang:list_to_atom(Receiver)),
Pid2 ! {Pid2, Reqmessage}. ////////////MY ERROR!!!!
checkUser(Client,Username) ->
case {lists:member(Username, [userList])} of
{true} -> Message1 = io:format("Username taken.~n"),
Client ! {Message1};
{false} -> append([userList], Username),
Message = io:format("You have been connected!~n"),
register(erlang:list_to_atom(Username), Client), //Registers the Client.
Client ! {Message}
end.
append([List|T],User) -> [List|append(T,User)];
append([],User) -> User.
loop() ->
receive
{Client, Message} ->
io:format("Server: received a message!~p~n",[Message]),
Client ! {Message},
loop()
end.
-module(hw5client).
-export([start/1,goOnline/2, loop/1, requestChatWith/2]).
start(Server) ->
%Server = hw5server:start().
spawn(hw5client, loop, [Server]),
loop(Server).
goOnline(Client_Node,Username) ->
hw5server:checkUser(Client_Node, Username),
Request = io:get_line("Enter 1 to request chat or 2 to go offline: "),
case {Request} of
{"1\n"} -> Target = io:get_line("Please enter recipient's username: "),
requestChatWith(Client_Node, Target)
end.
requestChatWith(Client_Node,Recipient) ->
hw5server:findUser(Client_Node,Recipient).
loop(Server) ->
Online = io:get_line("Enter 1 to go online: "),
case {Online} of
{"1\n"} -> Name = io:get_line("Please enter a username: "),
goOnline(self(), Name)
end,
receive
{_, Message} ->
io:format("~p",[Message]),
loop(Server)
end.