`

请您先登录,才能继续操作

[练习]简单的名字服务

 
阅读更多

使用gen_server做的简单的名字服务

 

步奏很简单 启动gen_server local注册一下服务名方便被引用

 

然后将字典放在State里面 提供查询等服务

 

代码如下:

%% @author cc fairjm
%% @doc @todo Add description to naming.


-module(naming).
-behaviour(gen_server).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).

%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0,stop/0,insert/2,remove/1,lookup/1]).
-define(SERVER,?MODULE).


%% ====================================================================
%% Behavioural functions 
%% ====================================================================
-record(state, {dic}).



start() ->
	gen_server:start_link({local,?SERVER}, ?MODULE, [], []).


insert(Key,Value) ->
	gen_server:cast(?SERVER,{insert,{Key,Value}})
.

remove(Key) ->
	gen_server:cast(?SERVER, {remove,Key}).

lookup(Key)->
	gen_server:call(?SERVER, {lookup,Key}).

stop() ->
	gen_server:cast(?SERVER, stop).

%% init/1
%% ====================================================================
%% @doc <a href="http://www.erlang.org/doc/man/gen_server.html#Module:init-1">gen_server:init/1</a>
-spec init(Args :: term()) -> Result when
	Result :: {ok, State}
			| {ok, State, Timeout}
			| {ok, State, hibernate}
			| {stop, Reason :: term()}
			| ignore,
	State :: term(),
	Timeout :: non_neg_integer() | infinity.
%% ====================================================================
init([]) ->
    {ok, #state{dic=dict:new()}}.


%% handle_call/3
%% ====================================================================
%% @doc <a href="http://www.erlang.org/doc/man/gen_server.html#Module:handle_call-3">gen_server:handle_call/3</a>
-spec handle_call(Request :: term(), From :: {pid(), Tag :: term()}, State :: term()) -> Result when
	Result :: {reply, Reply, NewState}
			| {reply, Reply, NewState, Timeout}
			| {reply, Reply, NewState, hibernate}
			| {noreply, NewState}
			| {noreply, NewState, Timeout}
			| {noreply, NewState, hibernate}
			| {stop, Reason, Reply, NewState}
			| {stop, Reason, NewState},
	Reply :: term(),
	NewState :: term(),
	Timeout :: non_neg_integer() | infinity,
	Reason :: term().
%% ====================================================================
handle_call({lookup,Key}, _From, State) ->
	#state{dic=Dic}=State,
	case dict:find(Key, Dic) of
     {ok,Value}->{reply, {ok,Value}, State};
	          _->{reply,{not_found},State}
	end.


%% handle_cast/2
%% ====================================================================
%% @doc <a href="http://www.erlang.org/doc/man/gen_server.html#Module:handle_cast-2">gen_server:handle_cast/2</a>
-spec handle_cast(Request :: term(), State :: term()) -> Result when
	Result :: {noreply, NewState}
			| {noreply, NewState, Timeout}
			| {noreply, NewState, hibernate}
			| {stop, Reason :: term(), NewState},
	NewState :: term(),
	Timeout :: non_neg_integer() | infinity.
%% ====================================================================
handle_cast({insert,{Key,Value}}, State) ->
	#state{dic=Dic}=State,
    {noreply, State#state{dic=dict:append(Key, Value,Dic )}};


handle_cast({remove,Key}, State) ->
	#state{dic=Dic}=State,
    {noreply, State#state{dic=dict:erase(Key, Dic)}};

handle_cast(stop, State) ->
	{stop,{normal},State}.

%% handle_info/2
%% ====================================================================
%% @doc <a href="http://www.erlang.org/doc/man/gen_server.html#Module:handle_info-2">gen_server:handle_info/2</a>
-spec handle_info(Info :: timeout | term(), State :: term()) -> Result when
	Result :: {noreply, NewState}
			| {noreply, NewState, Timeout}
			| {noreply, NewState, hibernate}
			| {stop, Reason :: term(), NewState},
	NewState :: term(),
	Timeout :: non_neg_integer() | infinity.
%% ====================================================================
handle_info(_Info, State) ->
    {noreply, State}.


%% terminate/2
%% ====================================================================
%% @doc <a href="http://www.erlang.org/doc/man/gen_server.html#Module:terminate-2">gen_server:terminate/2</a>
-spec terminate(Reason, State :: term()) -> Any :: term() when
	Reason :: normal
			| shutdown
			| {shutdown, term()}
			| term().
%% ====================================================================
terminate(_Reason, _State) ->
    ok.


%% code_change/3
%% ====================================================================
%% @doc <a href="http://www.erlang.org/doc/man/gen_server.html#Module:code_change-3">gen_server:code_change/3</a>
-spec code_change(OldVsn, State :: term(), Extra :: term()) -> Result when
	Result :: {ok, NewState :: term()} | {error, Reason :: term()},
	OldVsn :: Vsn | {down, Vsn},
	Vsn :: term().
%% ====================================================================
code_change(_OldVsn, State, _Extra) ->
    {ok, State}.


%% ====================================================================
%% Internal functions
%% ====================================================================

 其实只要写一点点代码就够了 erlang的代码简洁明了

 

调用如下:

(cc@dell-PC)8> c("naming").
{ok,naming}
(cc@dell-PC)9> naming:stop().
ok
(cc@dell-PC)10> naming:lookup(cc).
** exception exit: {noproc,{gen_server,call,[naming,{lookup,cc}]}}
     in function  gen_server:call/2 (gen_server.erl, line 180)
(cc@dell-PC)11> c("naming").
{ok,naming}
(cc@dell-PC)12> naming:start().
{ok,<0.68.0>}
(cc@dell-PC)13> naming:insert(cc,"hello").
ok
(cc@dell-PC)14> naming:lookup(cc).
{ok,["hello"]}
(cc@dell-PC)15> naming:remove(cc).
ok
(cc@dell-PC)16> naming:lookup(cc).
{not_found}
(cc@dell-PC)17> naming:stop().
** exception exit: {normal}
(cc@dell-PC)18>
=ERROR REPORT==== 12-Aug-2013::02:27:17 ===
** Generic server naming terminating
** Last message in was {'$gen_cast',stop}
** When Server state == {state,{dict,0,16,16,8,80,48,
                                     {[],[],[],[],[],[],[],[],[],[],[],[],[],
                                      [],[],[]},
                                     {{[],[],[],[],[],[],[],[],[],[],[],[],[],
                                       [],[],[]}}}}
** Reason for termination ==
** {normal}
(cc@dell-PC)18> naming:lookup(cc).
** exception exit: {noproc,{gen_server,call,[naming,{lookup,cc}]}}
     in function  gen_server:call/2 (gen_server.erl, line 180)

 远程也可以调用 用rpc就可:

(cc02@dell-PC)1> net_adm:ping('cc@dell-PC').
pong
(cc02@dell-PC)2> rpc:call('cc@dell-PC',naming,lookup,cc).
{badrpc,{'EXIT',{badarg,[{erlang,apply,
                                 [naming,lookup,cc],
                                 []},
                         {rpc,'-handle_call_call/6-fun-0-',5,
                              [{file,"rpc.erl"},{line,205}]}]}}}
(cc02@dell-PC)3> rpc:call('cc@dell-PC',naming,lookup,[cc]).
{badrpc,{'EXIT',{noproc,{gen_server,call,
                                    [naming,{lookup,cc}]}}}}
(cc02@dell-PC)4> rpc:call('cc@dell-PC',naming,lookup,[cc]).
{ok,["hello","hello2"]}
(cc02@dell-PC)5> rpc:call('cc@dell-PC',naming,lookup,[cc]).
{ok,["hello","hello2"]}
(cc02@dell-PC)6> rpc:call('cc@dell-PC',naming,lookup,[cc]).
{ok,["hello","hello2"]}
(cc02@dell-PC)7> rpc:call('cc@dell-PC',naming,lookup,[cc]).
{not_found}
(cc02@dell-PC)8> rpc:call('cc@dell-PC',naming,lookup,[cc]).
{badrpc,{'EXIT',{noproc,{gen_server,call,
                                    [naming,{lookup,cc}]}}}}
(cc02@dell-PC)9>

 

分享到:
评论

相关推荐

    Oracle 数据库经典练习

    最后,展示所有有提成的员工详细信息,可能包括名字、部门、工资和提成等,具体SQL语句基于以上练习中的第4点构建。 通过这些练习,不仅可以提升SQL技能,还能加深对Oracle数据库结构和功能的理解。对于IT行业从业...

    最简单的struts2练习

    这个"最简单的Struts2练习"项目对于初次接触Struts2框架的学习者来说是一个很好的起点。Struts2以其灵活性、可扩展性和对MVC(模型-视图-控制器)设计模式的出色支持而闻名。 在Struts2框架中,核心组件包括Action...

    一个简单算法先来先服务

    【一个简单算法先来先服务】(FCFS,First-Come First-Served)是一种非常基础的进程调度算法,它的核心原则是按照进程到达系统的先后顺序进行执行。在本代码示例中,FCFS 被用于模拟作业调度,作业被表示为 `JCB`...

    javaweb练习项目

    这个项目可能包含了一个简单的Web服务或者是一个小型的Web应用程序,通过实际操作来帮助开发者理解这些技术的工作原理和使用方式。 【描述】:“项目的原码,图片,依赖都有,只是作为学习用的,看看就好,图片都是...

    Oracle的sql语句练习含答案

    16. **日期运算**:`ADD_MONTHS`用于增加日期,如`Select ename,add_months(hiredate,12*10) ‘服务年限的日期’ from emp;`显示雇员的入职10周年纪念日期。 17. **排序**:`ORDER BY`用于排序结果集,如`Select * ...

    最新完形填空经典练习题 (3).doc

    在文中,作者负责分发面包和果汁给有需要的人,这是简单但重要的工作,直接服务于弱势群体。 3. **服务对象**:来求助的人包括无家可归者和困难家庭。他们都需要热食和暂时的避风港,显示了社会中存在不平等和贫困...

    小小的网页练习,内容是对三毛的一点点简介

    在本项目中,我们关注的是一个名为"小小的网页练习,内容是对三毛的一点点简介"的压缩包文件。这个压缩包显然包含了有关著名作家三毛的一些基本信息,可能是一个简单的HTML页面或者是一系列相关的文本文件。为了深入...

    练习2:使用jQuery美化英雄联盟简介页.zip

    比如,当用户悬停在英雄名字上时,可以淡入显示英雄的简介: ```javascript $(".hero-name").hover( function() { $(this).next(".hero-bio").fadeIn(); }, function() { $(this).next(".hero-bio").fadeOut()...

    python链接数据库项目练习

    下面是一个简单的示例,展示了如何创建连接,执行SQL语句,以及关闭连接: ```python import sqlite3 # 连接SQLite数据库 conn = sqlite3.connect('my_database.db') # 创建一个游标对象 cursor = conn.cursor() ...

    自定义标签小练习----一个简单的分页标签

    本篇博客“自定义标签小练习----一个简单的分页标签”将深入探讨如何实现这样一个实用功能,通过自定义标签来实现网页的分页展示。 首先,我们要理解自定义标签的工作原理。自定义标签是JSP标准标签库(JSTL)的...

    靶机W34KN3SS练习报告1

    在网络安全和渗透测试领域,靶机练习是一种常见的方式,用于提升技能并了解系统漏洞。"靶机W34KN3SS练习报告1"提供了一个详细的过程,展示了如何逐步攻破一个虚拟靶机,并最终获取root权限。以下是这个过程中的关键...

    xtu 湘潭大学网络编程练习题

    在本题目中,我们主要关注的是网络编程,特别是TCP和UDP...同时,它还涉及到了如何编写简单的TCP客户端程序,调用自定义的库函数进行连接并处理服务端的响应。对于学习网络编程的学生来说,这是一道很好的实践题目。

    考研英语小作文练习.doc

    1. **自我介绍与写作目的** —— 开始时简单介绍自己,说明为何写这封信,表达自己的关心和诚恳。 2. **提出建议** —— 委婉地表达问题所在,然后提出具体、可行的建议和改良措施,确保建议有针对性且具有实用性。 ...

    国网技术学院Mysql课堂练习,2023年

    本资源摘要信息主要介绍了 MySQL 数据库的管理和操作实践,包括数据库的安装和配置、数据库的创建、简单查询语句的练习题、创建和管理数据库及表等内容。 一、数据库的安装和配置 1. 在虚拟机中安装 WINDOWS7 操作...

    Thinking in Java 中文第四版+习题答案

    15.3 服务多个客户 15.4 数据报 15.5 一个Web应用 15.5.1 服务器应用 15.5.2 NameSender程序片 15.5.3 15.5.3 要注意的问题 15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 ...

    苏教六年级语文下册练习五PPT学习教案.pptx

    - 电子城:专门经营电子产品,产品多样,服务全面,有专业技术支持。 - 楼市:提供长期稳定的房地产供应,价格相对固定,具有空间不可移动性和价格一致性。 - 快餐店:提供快速供应的简单餐食,面向大众,价格...

    asp实例同学录-简单的asp实例,仅供学习练习用!

    例如,可以创建一个变量来存储同学的名字: ```vbscript Dim studentName studentName = "张三" ``` 3. **响应对象(Response)**:ASP中的Response对象用于向客户端发送数据。你可以使用`Response.Write()`...

    ssd8 exercise1

    这个练习可能旨在教授学生如何使用Java编程语言来实现简单的网络通信。 【描述】"ssd8 exercise1ssd8 exercise1"虽然重复,但可以推断出这是一个关于SSD8课程的第一次练习,可能是有关并发编程或网络编程的内容。...

Global site tag (gtag.js) - Google Analytics