使用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>
相关推荐
最后,展示所有有提成的员工详细信息,可能包括名字、部门、工资和提成等,具体SQL语句基于以上练习中的第4点构建。 通过这些练习,不仅可以提升SQL技能,还能加深对Oracle数据库结构和功能的理解。对于IT行业从业...
这个"最简单的Struts2练习"项目对于初次接触Struts2框架的学习者来说是一个很好的起点。Struts2以其灵活性、可扩展性和对MVC(模型-视图-控制器)设计模式的出色支持而闻名。 在Struts2框架中,核心组件包括Action...
【一个简单算法先来先服务】(FCFS,First-Come First-Served)是一种非常基础的进程调度算法,它的核心原则是按照进程到达系统的先后顺序进行执行。在本代码示例中,FCFS 被用于模拟作业调度,作业被表示为 `JCB`...
这个项目可能包含了一个简单的Web服务或者是一个小型的Web应用程序,通过实际操作来帮助开发者理解这些技术的工作原理和使用方式。 【描述】:“项目的原码,图片,依赖都有,只是作为学习用的,看看就好,图片都是...
16. **日期运算**:`ADD_MONTHS`用于增加日期,如`Select ename,add_months(hiredate,12*10) ‘服务年限的日期’ from emp;`显示雇员的入职10周年纪念日期。 17. **排序**:`ORDER BY`用于排序结果集,如`Select * ...
在文中,作者负责分发面包和果汁给有需要的人,这是简单但重要的工作,直接服务于弱势群体。 3. **服务对象**:来求助的人包括无家可归者和困难家庭。他们都需要热食和暂时的避风港,显示了社会中存在不平等和贫困...
在本项目中,我们关注的是一个名为"小小的网页练习,内容是对三毛的一点点简介"的压缩包文件。这个压缩包显然包含了有关著名作家三毛的一些基本信息,可能是一个简单的HTML页面或者是一系列相关的文本文件。为了深入...
比如,当用户悬停在英雄名字上时,可以淡入显示英雄的简介: ```javascript $(".hero-name").hover( function() { $(this).next(".hero-bio").fadeIn(); }, function() { $(this).next(".hero-bio").fadeOut()...
下面是一个简单的示例,展示了如何创建连接,执行SQL语句,以及关闭连接: ```python import sqlite3 # 连接SQLite数据库 conn = sqlite3.connect('my_database.db') # 创建一个游标对象 cursor = conn.cursor() ...
本篇博客“自定义标签小练习----一个简单的分页标签”将深入探讨如何实现这样一个实用功能,通过自定义标签来实现网页的分页展示。 首先,我们要理解自定义标签的工作原理。自定义标签是JSP标准标签库(JSTL)的...
在网络安全和渗透测试领域,靶机练习是一种常见的方式,用于提升技能并了解系统漏洞。"靶机W34KN3SS练习报告1"提供了一个详细的过程,展示了如何逐步攻破一个虚拟靶机,并最终获取root权限。以下是这个过程中的关键...
在本题目中,我们主要关注的是网络编程,特别是TCP和UDP...同时,它还涉及到了如何编写简单的TCP客户端程序,调用自定义的库函数进行连接并处理服务端的响应。对于学习网络编程的学生来说,这是一道很好的实践题目。
1. **自我介绍与写作目的** —— 开始时简单介绍自己,说明为何写这封信,表达自己的关心和诚恳。 2. **提出建议** —— 委婉地表达问题所在,然后提出具体、可行的建议和改良措施,确保建议有针对性且具有实用性。 ...
本资源摘要信息主要介绍了 MySQL 数据库的管理和操作实践,包括数据库的安装和配置、数据库的创建、简单查询语句的练习题、创建和管理数据库及表等内容。 一、数据库的安装和配置 1. 在虚拟机中安装 WINDOWS7 操作...
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程序 ...
- 电子城:专门经营电子产品,产品多样,服务全面,有专业技术支持。 - 楼市:提供长期稳定的房地产供应,价格相对固定,具有空间不可移动性和价格一致性。 - 快餐店:提供快速供应的简单餐食,面向大众,价格...
例如,可以创建一个变量来存储同学的名字: ```vbscript Dim studentName studentName = "张三" ``` 3. **响应对象(Response)**:ASP中的Response对象用于向客户端发送数据。你可以使用`Response.Write()`...
这个练习可能旨在教授学生如何使用Java编程语言来实现简单的网络通信。 【描述】"ssd8 exercise1ssd8 exercise1"虽然重复,但可以推断出这是一个关于SSD8课程的第一次练习,可能是有关并发编程或网络编程的内容。...