有意思的一段代码

有意思的一段代码:

  1 %%% Message passing utility.
  2 %%% User interface:
  3 %%% logon(Name)
  4 %%%     One user at a time can log in from each Erlang node in the
  5 %%%     system messenger: and choose a suitable Name. If the Name
  6 %%%     is already logged in at another node or if someone else is
  7 %%%     already logged in at the same node, login will be rejected
  8 %%%     with a suitable error message.
  9 %%% logoff()
 10 %%%     Logs off anybody at that node
 11 %%% message(ToName, Message)
 12 %%%     sends Message to ToName. Error messages if the user of this
 13 %%%     function is not logged on or if ToName is not logged on at
 14 %%%     any node.
 15 %%%
 16 %%% One node in the network of Erlang nodes runs a server which maintains
 17 %%% data about the logged on users. The server is registered as "messenger"
 18 %%% Each node where there is a user logged on runs a client process registered
 19 %%% as "mess_client"
 20 %%%
 21 %%% Protocol between the client processes and the server
 22 %%% ----------------------------------------------------
 23 %%%
 24 %%% To server: {ClientPid, logon, UserName}
 25 %%% Reply {messenger, stop, user_exists_at_other_node} stops the client
 26 %%% Reply {messenger, logged_on} logon was successful
 27 %%%
 28 %%% To server: {ClientPid, logoff}
 29 %%% Reply: {messenger, logged_off}
 30 %%%
 31 %%% To server: {ClientPid, logoff}
 32 %%% Reply: no reply
 33 %%%
 34 %%% To server: {ClientPid, message_to, ToName, Message} send a message
 35 %%% Reply: {messenger, stop, you_are_not_logged_on} stops the client
 36 %%% Reply: {messenger, receiver_not_found} no user with this name logged on
 37 %%% Reply: {messenger, sent} Message has been sent (but no guarantee)
 38 %%%
 39 %%% To client: {message_from, Name, Message},
 40 %%%
 41 %%% Protocol between the "commands" and the client
 42 %%% ----------------------------------------------
 43 %%%
 44 %%% Started: messenger:client(Server_Node, Name)
 45 %%% To client: logoff
 46 %%% To client: {message_to, ToName, Message}
 47 %%%
 48 %%% Configuration: change the server_node() function to return the
 49 %%% name of the node where the messenger server runs
 50
 51 -module(messenger).
 52 -export([start_server/0, server/1, logon/1, logoff/0, message/2, client/2]).
 53
 54 %%% Change the function below to return the name of the node where the
 55 %%% messenger server runs
 56 server_node() ->
 57 %    [email protected]
 58     [email protected]
 59 %    erlang:node().
 60
 61 %%% This is the server process for the "messenger"
 62 %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...]
 63 server(User_List) ->
 64     receive
 65         {From, logon, Name} ->
 66             New_User_List = server_logon(From, Name, User_List),
 67             server(New_User_List);
 68         {From, logoff} ->
 69             New_User_List = server_logoff(From, User_List),
 70             server(New_User_List);
 71         {From, message_to, To, Message} ->
 72  73             server_transfer(From, To, Message, User_List),
 74             io:format("list is now: ~p~n", [User_List]),
 75             server(User_List)
 76 end.
 77
 78 %%% Start the server
 79 start_server() ->
 80     register(messenger, spawn(messenger, server, [[]])).
 81
 82 %%% Server adds a new user to the user list
 83 server_logon(From, Name, User_List) ->
 84     %% check if logged on anywhere else
 85     case lists:keymember(Name, 2, User_List) of
 86         true ->
 87             From ! {messenger, stop, user_exists_at_other_node},  %reject logon
 88             User_List;
 89 false ->
 90             From ! {messenger, logged_on},
 91             [{From, Name} | User_List]
 92 end.
 93
 94 %%% Server deletes a user from the user list
 95 server_logoff(From, User_List) ->
 96     lists:keydelete(From, 1, User_List).
 97
 98 %add user to the list
 99 %%% Server transfers a message between user
100 server_transfer(From, To, Message, User_List) ->
101     %% check that the user is logged on and who he is
102     case lists:keysearch(From, 1, User_List) of
103         false ->
104             From ! {messenger, stop, you_are_not_logged_on};
105         {value, {From, Name}} ->
106             server_transfer(From, Name, To, Message, User_List)
107     end.
108
109 %%% If the user exists, send the message
110 server_transfer(From, Name, To, Message, User_List) ->
111     %% Find the receiver and send the message
112     case lists:keysearch(To, 2, User_List) of
113         false ->
114             From ! {messenger, receiver_not_found};
115         {value, {ToPid, To}} ->
116             ToPid ! {message_from, Name, Message},
117             From ! {messenger, sent}
118     end.
119
120 %%% User Commands
121 logon(Name) ->
122     case whereis(mess_client) of
123         undefined ->
124 125             register(mess_client,
126                      spawn(messenger, client, [server_node(), Name]));
127         _ -> already_logged_on
128     end.
129
130 logoff() ->
131     mess_client ! logoff.
132
133 message(ToName, Message) ->
134     case whereis(mess_client) of % Test if the client is running
135         undefined ->
136             not_logged_on;
137         _ -> mess_client ! {message_to, ToName, Message},
138 139              ok
140     end.
141
142 %%% The client process which runs on each server node
143 client(Server_Node, Name) ->
144     {messenger, Server_Node} ! {self(), logon, Name},
145     await_result(),
146     client(Server_Node).
147
148 client(Server_Node) ->
149 150     receive
151         logoff ->
152             {messenger, Server_Node} ! {self(), logoff},
153             exit(normal);
154         {message_to, ToName, Message} ->
155156             {messenger, Server_Node} ! {self(), message_to, ToName, Message},
157             await_result();
158         {message_from, FromName, Message} ->
159             io:format("Message from ~p: ~p~n", [FromName, Message])
160     end,
161     client(Server_Node).
162
163 %%% wait for a response from the server
164 await_result() ->
165     receive
166         {messenger, stop, Why} -> % Stop the client
167             io:format("~p~n", [Why]),
168             exit(normal);
169         {messenger, What} ->  % Normal response
170             io:format("~p~n", [What])
171     end.

其中

server_node()代码必须全局固定。

这是服务端:

([email protected])131>
([email protected])131> messenger:start_server().
true
([email protected])132>
([email protected])132>
([email protected])132> messenger:logon(frank).
logged_on
true
([email protected])133>
([email protected])133>
([email protected])135> messenger:message(mini, "123.123.123.").
list is now: [{<10396.45.0>,mini},{<0.333.0>,frank}]
sent
ok
([email protected])136>
([email protected])136> 

这是客户端:

([email protected])2> messenger:logon(mini).
true
logged_on
([email protected])3>
([email protected])3> 

([email protected])6>
([email protected])6>
([email protected])6>
Message from frank: "123.123.123."
([email protected])6>

ending 。。。。。。

时间: 2024-08-26 07:41:18

有意思的一段代码的相关文章

关于+—~有意思的一段C代码

关于+ - ~有意思的一段C代码 问题是钟哥几天前在automation的群里面抛出来的. code: #include <stdio.h> int main(int argc,char* argv[]) { int a = 7; int b = 1; printf("before process,a = %d,b = %d\n",a,b); b = +~ +~ +~ +~ + ~~a; printf("after process,a = %d,b = %d\n&

从一段代码看fork()函数及其引发的竞争

首先来看一段从<UNIX环境高级编程>中摘录的一段非常有意思的代码.借此我们再来谈谈fork()函数的一些问题. #include "apue.h" static void charatatime(char*); int main(void) { pid_t pid; if((pid=fork())<0){ err_sys("fork error"); }else if(pid==0){ charatatime("output from

关于hrtimer_forward小段代码的分析【转】

转自:http://blog.csdn.net/wowuyinglingluan/article/details/45720151 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 整段代码 关于无效的forward 关于定时精度问题 精确调整和overrun问题 存疑 随着各种嵌入式设备上采用linux,特别是Android系统的广泛应用,linux的hrtimer高精度模式开始被广泛支持.当然,虽说可以支持到ns精度,具体实现依赖于硬件定时器和内核编译条件,不过,一般情

有没有一段代码,让你觉得人类的智慧也可以璀璨无比?

网友在知乎的一个提问帖:有没有一段代码,让你觉得人类的智慧也可以璀璨无比?不一定要是完整算法,就是那种看着看着就觉得嗨爆了,惊为天人的结构或语句.下面是[烧茄子]引用了知名博主 Matrix67 的一篇博文:<用三段 140 字符以内的代码生成一张 1024×1024 的图片>Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推这么长的代码来生成一张图片.具体地说,参赛者需要用 C++

viewpager 自动无限循环 这段代码移到你的程序中就可以用了

本程序需要懂得viewpager的基础知识,也就是说你能够自己写出一个手动滑动的viewpager,下面我将附带加小圆点的知识 那么我们回顾一下图片轮转的基础知识,如果你已经对viewpager很熟悉了就不用看了,浪费时间 1.viewpager是在v4兼容报里面的,使用控件时请带上报名 2.数据来源用list存放,我这里用的是textview做的小圆点list<textview>,layout做的单张幻灯片list<view>,将xml文件inflate成为view,View.i

iOS测试一段代码的运行时间

王刚韧 23:19:26测试一段代码的运行时间 测试一段代码运行花了多久: NSDate* tmpStartData = [NSDate date] ;<#代码#> double deltaTime = [[NSDate date] timeIntervalSinceDate:tmpStartData]; NSLog(@"------cost time = %f ms(毫秒)", deltaTime*1000);

看到一段代码不明白什么意思

from warnings import filterwarnings, catch_warnings with catch_warnings():     if sys.py3kwarning:         filterwarnings("ignore", ".*mimetools has been removed",                         DeprecationWarning)     import mimetools import

将PC端的网站转化成手机端网站需要增加以下这段代码即可,再布局一下界面即可

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" /> 将PC端的网站转化成手机端网站需要增加以下这段代码即可,再布局一下界面即可,布布扣,bubuko.com

找出线上java应用中的哪段代码在大量耗费性能

from:http://chenjianjx.iteye.com/blog/1681681 你发现你的机器的cpu usage达到了100%,并且发现都是你的java应用导致的:但是,这个应用里具体哪段代码在这样吃性能呢? 以下来自一个同事的分享: 1. 先找出吃性能的线程: top -H -p pid,找出最耗性能的线程ID(最左列) 2. 获得线程ID的16进制表示: printf '0x%x\n' 线程ID 3. 然后生成一下jstack,比如 kill -3 pid 4. 在生成的jst