2014-05-04 134 views
0

我正在通過併發的Erlang網站上的例子。我目前正在研究實現簡單聊天信使的第3.5節。 下面是代碼:Erlang節點配置

-module(messenger). 
    -export([start_server/0, server/1, goOnline/1, goOffline/0, message/2, client/2]). 
    server_node() -> 
     [email protected] 
    server(User_List) -> 
     receive 
      {From, logon, Name} -> 
       New_User = server_goOnline(From, Name, User_List), 
       server(New_User); 
      {From, logoff} -> 
       New_User = server_goOffline(From, User_List), 
       server(New_User); 
      {From, message_to, To, Message} -> 
       server_transfer(From, To, Message, User_List), 
       io:format("list is now: ~p~n", [User_List]), 
       server(User_List) 
     end. 

    start_server() -> 
     register(messenger, spawn(messager, server, [[]])). 

    server_goOnline(From, Name, User_List) -> 
     case lists:keymember(Name, 2, User_List) of 
      true -> 
       From ! {messenger, stop, user_exists_at_other_node}, 
       User_List; 
      false -> 
       From ! {messenger, logged_on}, 
       [{From, Name} | User_List] 
     end. 

    server_goOffline(From, User_List) -> 
     lists:keydelete(From, 1, User_List). 

    server_transfer(From, To, Message, User_List) -> 
     case lists:keysearch(From, 1, User_List) of 
      false -> 
       From ! {messenger, stop, you_are_not_logged_on}; 
      {value, {From, Name}} -> 
       server_transfer(From, Name, To, Message, User_List) 
     end. 

server_transfer(From, Name, To, Message, User_List) -> 
    case lists:keysearch(To, 2, User_List) of 
     false -> 
      From ! {messenger, receiver_not_found}; 
     {value, {ToPid, To}} -> 
      ToPid ! {message_from, Name, Message}, 
      From ! {messenger, sent} 
    end. 

goOnline(Name) -> 
    case whereis(mess_client) of 
     undefined -> 
      register(mess_client, 
        spawn(messenger, client, [server_node(), Name])); 
     _ -> already_logged_on 
    end. 

goOffline() -> 
    mess_client ! logoff. 

message(ToName, Message) -> 
    case whereis(mess_client) of 
     undefined -> 
      not_logged_on; 
     _ -> mess_client ! {message_to, ToName, Message}, 
      ok 
end. 

client(Server_Node, Name) -> 
    {messenger, Server_Node} ! {self(), goOnline, Name}, 
    await_result(), 
    client(Server_Node). 

client(Server_Node) -> 
    receive 
     logoff -> 
      {messenger, Server_Node} ! {self(), logoff}, 
      exit(normal); 
     {message_to, ToName, Message} -> 
      {messenger, Server_Node} ! {self(), message_to, ToName, Message}, 
      await_result(); 
     {message_from, FromName, Message} -> 
      io:format("Message From ~p: ~p~n", [FromName, Message]) 
     end, 
     client(Server_Node). 

await_result() -> 
    receive 
     {messenger, stop, Why} -> 
      io:format("~p~n", [Why]), 
      exit(normal); 
     {messneger, What} -> 
      io:format("~p~n", [What]) 
    end. 

的教程說配置server_node() - >到節點,在我的使者服務器運行。我如何配置該功能?我不完全知道這意味着什麼,我的問題是如何配置server_node註冊我的服務器位置信使。

回答

1

如果您使用命令erl -sname somename開始二郎,你應該有如下形式的提示:

([email protected])1> 

只需

server_node() -> 
     [email protected] 

替換代碼

server_node() -> 
     [email protected] 

,並重新編譯代碼。

+0

嗯,這正是我所做的然而我得到這個錯誤,真正的錯誤在過程<0.40.0>節點'super @ timberlake'退出值:{undef,[{messager,server,[[]],[]}] } – user2757849

+0

稍後我會看看這段代碼(現在是睡覺的時候了......) – Pascal

+1

錯誤消息表明調用messager:server()是未定義的。我認爲你在start_server-function中產生了一個產生錯誤的輸入錯誤。 Erlang的錯誤信息實際上在您習慣時非常有用。 – mbesso