通用的server

Erlang代码 
  1. Mod = my_server.  
  2. Mod:start().  
这样的代码会启动my_server,借助这个功能,我们可以把模块名作为参数传入,还可以使用模块名作为进程的注册名,于是,代码就便成了这样 
Erlang代码 
  1. % my_server5.erl %  
  2. -module(my_server5).  
  3. -export([start/2,stop/1]).  
  4. -export([init/2]).  
  5. -export([request/2]).  
  6.   
  7. % 启动一个模块,注册服务的名称为模块名称 %  
  8. start(Mod,Env) -> spawn(my_server5,init,[Mod,Env]).  
  9.   
  10. stop(Mod) -> Mod ! stop .  
  11.   
  12. %请求响应式接口,具体的实现实际上依靠Mod模块的 handle_request 方法%  
  13. request(Mod, Request) ->  
  14.     Mod ! { request, self(), Request },  
  15.     ok.  
  16.   
  17. % 初始化服务,注册名称,启动init方法,初始化服务时接受一个参数 %  
  18. init(Mod, Env) ->   
  19.         register(Mod,self()),  
  20.         State = Mod:init(Env),  
  21.         loop(Mod,State).  
  22.   
  23. % 实际执行体 %  
  24. loop(Mod, State) ->  
  25.     receive  
  26.         { request,From,Request } ->  
  27.             {Res,State2} = Mod:handle_request(Request,State),  
  28.             From ! {Mod, Res},  
  29.             loop(Mod,State2);  
  30.         stop ->  
  31.             io:format("process stopped.last state is ~p~n",[State])  
  32.     end.  
使用这段代码,我们只要完成一个回调模块就可以了,例如: 
Erlang代码 
  1. % my_handle1.erl %  
  2. -module(my_handle1).  
  3. -export([init/1,handle_request/2]).  
  4.   
  5. init(State) -> State.  
  6.   
  7. handle_request(Request,State) ->  
  8.     io:format("request to callback1: ~p~n",[Request]),  
  9.     {"ok",State}.  
运行一下—— 
Erlang shell代码 
  1. Eshell V5.7.2  (abort with ^G)  
  2. 1> c(my_server5),c(my_client),c(my_handle1).  
  3. {ok,my_handle1}  
  4. 2> C = my_client:start(),my_server5:start(my_handle1,"init").  
  5. <0.49.0>  
  6. 3> my_server5:request(my_handle1, "hello").  
  7. request to callback1: "hello"  
  8. ok  
  9. 4> my_server5:stop(my_handle1).  
  10. process stopped.last state is "init"  
  11. stop  

posted @ 2010-07-28 09:31  麦飞  阅读(304)  评论(0编辑  收藏  举报