2014-05-04 106 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