当前位置:K88软件开发文章中心编程语言非主流编程语言Erlang → 文章内容

Erlang 增加健壮性后的完整示例

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:23:50

{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).%%% wait for a response from the serverawait_result() -> receive {messenger, stop, Why} -> % Stop the client io:format("~p~n", [Why]), exit(normal); {messenger, What} -> % Normal response io:format("~p~n", [What]) after 5000 -> io:format("No response from server~n", []), exit(timeout) end.主要有如下几处改动:Messager 服务器捕捉进程退出。如果它收到进程终止信号,{'EXIT',From,Reason},则说明客户端进程已经终止或者由于下面的原因变得不可达: 用户主动退出登录(取消了 “logoff” 消息)。与客户端连接的网络已经断开。客户进程所处的结点崩溃。客户进程执行了某些非法操作。 如果收到上面所述的退出信号,服务器调用 server_logoff 函数将 {From, Name} 元组从 User_Lists 列表中删除。如果服务端所在的结点崩溃了,那么系统将将自动产生进程终止信号,并将其发送给所有的客户端进程:'EXIT',MessengerPID,noconnection},客户端进程收到该消息后会终止自身。 同样,在 await_result 函数中引入了一个 5 秒钟的定时器。也就是说,如果服务器 5 秒钟之类没有回复客户端,则客户端终止执行。这个只是在服务端与客户端建立连接前的登录阶段需要。 一个非常有意思的例子是如果客户端在服务端建立连接前终止会发生什么情况呢?需要特别注意,如果一个进程与另一个不存在的进程建立连接,则会收到一个终止信号 {'EXIT',From, noproc}。这就好像连接建立后进程立马就结束了一样。

上一页  [1] [2] 


Erlang 增加健壮性后的完整示例