erlang(1)

  1. %%server1.erl:
  2. -module(server1)
  3. -export([start/2,rpc/2])
  4. start(Name,Mod)->
  5.     register(Name,spawn(fun()->loop(Name,Mod,Mod:init())end)).
  6. rpc(Name,Request)->
  7.     Name!{self(),Request},
  8.     receive
  9.        {Name,Response}->Response
  10.     end.
  11. loop(Name,Mod,State)->
  12.     receive
  13.     {From,Request}->
  14.         {Response,State1}=Mod:handle(Request,State),
  15.         From!{Name,Response},
  16.         loop(Name,Mod,State1)
  17.     end.

这段代码实现了一个基本的服务器功能。

与常见的服务器不同,这个服务器不处理具体的业务,而是在接收到请求后调用传进来模块的相应方法(handle)去处理。

第二,这个服务器提供了向指定的进程发送指定消息的功能,个人觉得把这个rpc放到回调模块中可能更容易理解。

  1. %%name_server:
  2. -module(name_server).
  3. -export([init/0,add/2,whereis/1,handle/2]).
  4. -import(server1,[rpc/2]).
  5. add(Name,Place)->rpc(name_server,{add,Name,Place}).
  6. whereis(Name)->rpc(name_server,{whereis,Name}).
  7. init()->dict:new().
  8. handle({add,Name,Place},Dict)->{ok,dict:store(Name,Place,Dict)};
  9. handle({whereis,Name},Dict)->{dict:find(Name,Dict),Dict}.

这是一个回调模块,可用于初始化服务器,提供服务器调用的接口,并进行具体的业务实现。 在JAVA,C# 等编程语言中,一般都是接口和具体的实现分开的,所以这是erlang与他们不同的地方之一。

下面是具体的运行:

  1. 1>server1:start(name_server,name_server).
  2. true
  3. 2>name_server:add(joe,”at home”).
  4. ok
  5. 3>name_server:whereis(joe).
  6. {ok,”at home”}

第一句代码运行后我们启动了一个进程,这个进程先调用了name_server:init,然后等待处理客户端进程发送过来的请求。一但接收到请求,就调用初始化模块name_server:handle/2 去处理,并将结果发送回客户端进程。

第二句代码,我们使用了服务器提供的发送请求的功能,向name_server进程发送了{add,joe,”at home”} 这样的消息。服务器接收到后就调用name_server回调模块中的handle方法去处理。

第三句代码又向name_server进程发送了{whereis,joe} 这样的消息,服务器进程接收到后同样调用name_server回调模块中的handle方法去处理。

 

在这里其实是涉及到三个东西的:被注册为name_server的服务器进程;shell所在的客户端进程;可以用来初始化服务器进程,并做具体业务实现的回调模块name_server。



发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)