2014-05-09 4 views
0

제 목표는 클라이언트 프로세스를 먼저 시작하는 것입니다. 그런 다음 지정된 서버에 등록 할 수 있습니다. 두 단계를 완료했습니다. 내가 처음과 같이 내 클라이언트/서버 프로세스를 만들Erlang 클라이언트 프로세스 등록

:

loop(Userlist, Chatlist) -> 
receive 
{From, online, Username} -> 
     List = tryGoOnline(From, Username, Userlist), 
     loop(List, Chatlist); 
end. 
: 이것은 다음 내 서버 프로세스를 돌아갑니다

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

: 간다

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

클라이언트 루프를 실행

그런 다음 사용자가 목록에 같은 이름이 등록되어 있는지 여부에 따라 온라인 상태로 전환하려고합니다.

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 함수에서 모든 호출됩니다에 fwrite ("~ P ~ N", [clientPid])를 goOnline 기능과 그것을 유지 : 나는 IO의 디버그를했다
goOnline(Username, Server) -> 
case whereis(clientPid) of 
    undefined -> "You must register the client first!"; 
    _ -> clientPid ! {online, Server, Username} **///PROBLEM HERE!!** 
end. 

'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

이 줄 :

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

은 다음과 같아야합니다

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

whereis가 등록 당신에게 PID를 제공합니다 원자.

이 원자와 함께 등록 된 PID가 아니라 clientPid 원자로 메시지를 보내고 있습니다.

+0

지금 테스트 할 수 없지만 ClientPID가 등록 된 아톰의 PID와 일치하는 이유는 무엇입니까? 나는 변수 ClientPID를 만들지 않았다. 나는 이것이 매우 어리석은 질문 일 정도로 erlang하기 매우 새로울 것이다. – Nolemonpledge

+0

'ClientPID'는 변수입니다. 당신은 얼랑의 원자와 변수에 대해 읽어야한다. – Ankur

관련 문제