
erlang
yjl49
这个作者很懒,什么都没留下…
展开
-
erlang(1)
%%server1.erl:-module(server1)-export([start/2,rpc/2])start(Name,Mod)-> register(Name,spawn(fun()->loop(Name,Mod,Mod:init())end)).原创 2011-09-05 22:53:19 · 1908 阅读 · 0 评论 -
Erlang 聊天室程序( 一)
为了熟悉Erlang的套接字编程开始编写一个“聊天室”程序。基本流程如下: 1.服务器启动监听指定端口 2.启动一个gen_server 作为聊天室进程,里面使用ets 保持当前所有客户端连接信息,并负责将某个客户端的消息广播到所有在线客户端 3.服务器接受客户端连接,并绑定到一个gen_server进程 4.客户端维护进程接受客户端发送的消息,调用聊天室进程函数进行广播 5...2012-02-24 16:01:00 · 315 阅读 · 0 评论 -
Erlang gen_server:start_link/3 和gen_server:start_link/4
两个方法都可以用来启动一个gen_server服务器进程,具体的参数如下: gen_server:start_link(Module,Args,Option); gen_server:start_link(ServerName,Module,Args,Option); 第二个方法只比第一个多了个ServerName,在gen_server的源码中区别如下:start_lin...2012-02-24 11:32:00 · 334 阅读 · 0 评论 -
Erlang mnesia(一) 生成sequence 查错过程
整了段代码,想用mnesia数据库来实现类似于Oracle中sequence 的功能。原代码如下:%% Author: Administrator%% Created: 2012-2-16%% Description: TODO: Add description to id_generator-module(id_generator).-behavior(gen_serv...2012-02-17 17:57:00 · 124 阅读 · 0 评论 -
Erlang 从URL中截取尾部文件名
分析项目edownloader时看到的代码: 从 “http://www.aaaa.com.cn/download/bbb/ccc.exe” 中截取ccc.exeuri.hrl-record(uri, {scheme, %% "http", "ftp" user_info="", %% [] | "srp" ho...2012-02-16 16:02:00 · 143 阅读 · 0 评论 -
Erlide 的安装使用
erlang 开发平台很少,做JAVA开发的人做erlang开发,肯定会怀念eclipse中的快捷键操作,配置调试,语法高亮等。Erlide则是这么一款基于eclipse 的erlang开发插件,目前的版本是0.13.9 安装步骤如下: 1.安装erlang开发环境(版本至少为R13B-5) 2.安装eclipse 3.eclipse-->help--->instal...2012-02-16 12:10:00 · 155 阅读 · 0 评论 -
erlang socket
目标是验证“将客户端连接的socket绑定到一个gen_server后,发送到socket 的消息将由gen_server的handle_info/2 处理”。 接收客户端socket 连接的server: -module("myserver").-export([start/2],[stop/0]).start()-> %%监听端口 {ok,List...2011-11-27 17:03:00 · 202 阅读 · 0 评论 -
HotWheels
霸哥的话:小型的项目,你都搞明白了,就很猛了! 启动过程: make run1 run1在MakeFile中的定义: run1: compile erl $(LOCAL_OPTS) -name $(NODE) -s janus start janus.erl内容: start() -> start([]).st...2011-11-10 20:22:00 · 184 阅读 · 0 评论 -
erlang debug 调试
erlang 提供了一个debugger 调试工具,可以用来单步调试自己的代码。可以在shell 中输入im() 或 debugger:start() 来调出。首先打开的是一个Monitor 窗口:在这里可以选择要调试的代码:选择Module--> Interpret。注意调试的文件必须要通过debug_info 的方式进行编译: c(module.erl,debug_in...2011-10-25 21:30:00 · 317 阅读 · 0 评论 -
Erlang 聊天室程序(二) 客户端的退出
接着上一篇Erlang 聊天室程序(一) 。客户端退出会导致服务器端异常退出。 异常信息如下:client sockt closed ** exception exit: {bad_return_value,true} 显然已经在client_session的 handle_info({tcp_closed,Socket},State) 中捕捉到了Socket断链信息。h...2012-02-25 13:01:00 · 241 阅读 · 0 评论 -
Erlang 聊天室程序(三) 数据交换格式---json的decode
霸哥的blog中提到过Erlang服务器在通信中与客户端的数据交换方式:yufeng 为了简单起见这个聊天室程序采用json,要使用到rfc4627这个库 先定义一个Message类: public class Message { String id; //消息ID String type; //消息类型 String from; //发送方 St...2012-02-27 18:29:00 · 184 阅读 · 0 评论 -
Erlang supervisor 中的simple_one_for_one
Erlang 中的supervisor子进程的启动策略定义除了one_for_one、one_for_all、rest_for_one还有一种比较常用的simple_one_for_one。 这种策略与one_for_one比较相似,但在supervisor:init中定义的子进程只能有一个,以后启动的子进程都是以这个为模板产生,且在supervisor 启动时不...原创 2012-03-28 12:46:35 · 724 阅读 · 0 评论 -
Erlang 尾递归
尾递归就是在一系列语句的最后又跳转到被调用函数的开头。这里的“最后”两个字很关键,不正确的递归调用会吃光你的内存。litaocheng 在他的blog中就提到过一个很好的例子:here 观察下面的代码: do_t1() -> try recive _-> ...原创 2012-03-14 18:08:12 · 588 阅读 · 0 评论 -
Erlang 聊天室程序(九) 主题房间2 ---房间信息管理
接着上一篇,这次处理“维护当前可用的主题房间信息”问题。 每次使用startChild启动子进程的时候将当前的房间信息保存到ets表中。更重要的是每次主题房异常退出或重启都要更新对应的信息。 修改room_manager.erl中的内容:新建一个函数来初始化房间信息表:initTab()-> ets:new(roominfo,[public...原创 2012-03-14 14:20:15 · 382 阅读 · 0 评论 -
Erlang 聊天室程序(八) 主题房间---supervisor 的使用
之前实现的功能相当于一个大厅,这里我们为这个聊天室程序添加“主题房间的功能”。客户端登陆后处于大厅中,然后获取目前所有的主题房间,再发送消息进入到某个房间内。同一房间的成员可见,发送的消息也只限本房间可见。 为了管理这些房间,Erlang Opt中的监控树是最合适的。 新建一个模块room_manager.erl 其行为遵守gen_supervisor,子进程为chat_room...2012-03-02 18:03:00 · 455 阅读 · 0 评论 -
Erlang 聊天室程序(七) 获取在线用户
先定义消息格式如下: 请求: #message{type="get",subject="clientinfo",content="all"} 响应:#message{type="result",subject="clientinfo",content=[#clientinfo,#clientinfo,.....]} 修改客户端发送请求消息部分: clientThread.send...2012-03-02 14:12:00 · 354 阅读 · 0 评论 -
Erlang 聊天室程序(六) 设置客户端信息2
上篇开了个头编写了基本的框架,这次连同客户端服务器端代码一起完善下。 首先修改客户端代码: 之前在数据交换部分,客户端中定义了一个Message bean类,里面包含了发送一条消息所需要的基本信息,包括id、type、subject、from、to、content等。但这里的content是一个String 类型,如果要表示更复杂的消息就不太适用了。 由于所有的消息id、...2012-03-01 14:25:00 · 412 阅读 · 0 评论 -
Erlang 聊天室程序(五) 设置客户端信息
接下来实现设置客户端信息功能,使客户端可以设置自己的名称、性别、年龄、所做省份等信息。我们暂时不管客户端如何实现,先对服务器端代码进行调整。 这里需要做以下几件事: 1.修改client_session中handle_info({tcp,Socket,Data},State) 函数对接收到的消息包的处理,使其能支持“客户端信息设置消息”。 考虑到后面还会有更多种类的消息,在这里添加一...2012-02-28 17:30:00 · 168 阅读 · 0 评论 -
Erlang 聊天室程序(四) 数据交换格式---json的encode
上一篇实现了json数据到message记录的转换,这篇则是将message还原为json以便发送给客户端。 首先完善上篇中creationDate部分的解析:para({"creationDate",Val},Data)-> {obj,List}=Val, Time=#time{}, NewData1=Data#message{time=Time}, NewDat...2012-02-27 21:03:00 · 144 阅读 · 0 评论 -
Erlang 聊天室程序(八) 主题房间---supervisor 的使用
之前实现的功能相当于一个大厅,这里我们为这个聊天室程序添加“主题房间的功能”。客户端登陆后处于大厅中,然后获取目前所有的主题房间,再发送消息进入到某个房间内。同一房间的成员可见,发送的消息也只限本房间可见。 为了管理这些房间,Erlang Opt中的监控树是最合适的。 新建一个模块room_manager.erl 其行为遵守gen_supervisor,子进程为原创 2012-03-02 18:03:20 · 4052 阅读 · 2 评论 -
Erlang 聊天室程序(七) 获取在线用户
先定义消息格式如下: 请求: #message{type="get",subject="clientinfo",content="all"} 响应:#message{type="result",subject="clientinfo",content=[#clientinfo,#clientinfo,.....]}原创 2012-03-02 14:12:21 · 3729 阅读 · 0 评论 -
Erlang gen_server:start_link/3 和gen_server:start_link/4
两个方法都可以用来启动一个gen_server服务器进程,具体的参数如下: gen_server:start_link(Module,Args,Option); gen_server:start_link(ServerName,Module,Args,Option); 第二个方法只比第一个多了个Serv原创 2012-02-24 11:32:04 · 5023 阅读 · 0 评论 -
HotWheels
霸哥的话:小型的项目,你都搞明白了,就很猛了! 启动过程: make run1 run1在MakeFile中的定义: run1: compile erl $(LOCAL_OPTS) -name $(NODE) -s janus startjanus.erl内容:start原创 2011-11-10 20:22:23 · 2116 阅读 · 0 评论 -
erlang debug 调试
erlang 提供了一个debugger 调试工具,可以用来单步调试自己的代码。可以在shell 中输入im() 或 debugger:start() 来调出。首先打开的是一个Monitor 窗口:在这里可以选择要调试的代码:选择Module--> Interpret。注意调试的文件必须要通过debug_info 的方式进行编译: c(module.erl,debug_info原创 2011-10-25 21:30:09 · 2930 阅读 · 0 评论 -
erlang(2) gen_server
通过前面的erlang(1)我们了解到了一个基本的服务器的实现方法。erlang中为我们提供了这样一个服务器的现成的实现,就是gen_server,不用自己去编写服务器程序了。所要做的就是以下几个事:1.确定我们回调模块的名称2.编写接口函数3.实现六个回调方原创 2011-09-13 21:00:57 · 1361 阅读 · 0 评论 -
Erlide 的安装使用
erlang 开发平台很少,做JAVA开发的人做erlang开发,肯定会怀念eclipse中的快捷键操作,配置调试,语法高亮等。Erlide则是这么一款基于eclipse 的erlang开发插件,目前的版本是0.13.9 安装步骤如下: 1.安装erlang开发环境(版本至少为R13B-5)原创 2012-02-16 12:10:11 · 4720 阅读 · 0 评论 -
Erlang 从URL中截取尾部文件名
分析项目edownloader时看到的代码: 从 “http://www.aaaa.com.cn/download/bbb/ccc.exe” 中截取ccc.exeuri.hrl-record(uri, {scheme, %% "http", "ftp" user_info="", %% [] | "sr原创 2012-02-16 16:02:18 · 3122 阅读 · 0 评论 -
erlang socket
目标是验证“将客户端连接的socket绑定到一个gen_server后,发送到socket 的消息将由gen_server的handle_info/2 处理”。 接收客户端socket 连接的server:-module("myserver").-export([start/2],[stop/0]).start()-> %%监听端口 {ok,原创 2011-11-27 17:03:33 · 1970 阅读 · 1 评论 -
Erlang 聊天室程序(五) 设置客户端信息
接下来实现设置客户端信息功能,使客户端可以设置自己的名称、性别、年龄、所做省份等信息。我们暂时不管客户端如何实现,先对服务器端代码进行调整。 这里需要做以下几件事: 1.修改client_session中handle_info({tcp,Socket,Data},State) 函数对接收到的消息包的处理,使其能支持“客户端信息设置消息”。原创 2012-02-28 17:30:09 · 3660 阅读 · 5 评论 -
Erlang 聊天室程序(三) 数据交换格式---json的decode
霸哥的blog中提到过Erlang服务器在通信中与客户端的数据交换方式:yufeng 为了简单起见这个聊天室程序采用json,要使用到rfc4627这个库 先定义一个Message类:public class Message { String id; //消息ID String type; //消息类型 String fro原创 2012-02-27 18:29:25 · 4295 阅读 · 0 评论 -
Erlang 聊天室程序(四) 数据交换格式---json的encode
上一篇实现了json数据到message记录的转换,这篇则是将message还原为json以便发送给客户端。 首先完善上篇中creationDate部分的解析:para({"creationDate",Val},Data)-> {obj,List}=Val, Time=#time{}, NewData1=Data#message{time=Time},原创 2012-02-27 21:03:56 · 3474 阅读 · 0 评论 -
Erlang mnesia(一) 生成sequence 查错过程
整了段代码,想用mnesia数据库来实现类似于Oracle中sequence 的功能。原代码如下:%% Author: Administrator%% Created: 2012-2-16%% Description: TODO: Add description to id_generator-module(id_generator).-behavior(gen_server).原创 2012-02-17 17:57:56 · 2990 阅读 · 0 评论 -
Erlang 聊天室程序(二) 客户端的退出
接着上一篇Erlang 聊天室程序(一) 。客户端退出会导致服务器端异常退出。 异常信息如下:client sockt closed ** exception exit: {bad_return_value,true} 显然已经在client_session的 handle_info({tcp_closed,Socket},Sta原创 2012-02-25 13:01:09 · 4753 阅读 · 0 评论 -
Erlang 聊天室程序( 一)
为了熟悉Erlang的套接字编程开始编写一个“聊天室”程序。基本流程如下: 1.服务器启动监听指定端口 2.启动一个gen_server 作为聊天室进程,里面使用ets 保持当前所有客户端连接信息,并负责将某个客户端的消息广播到所有在线客户端 3.服务器接受客户端连接,并绑定到一个gen_server进程原创 2012-02-24 16:01:55 · 9487 阅读 · 4 评论 -
Erlang 中进程的两种调用方式
一个常见的情况: supervisor 下启动了N个子进程,如何访问这些子进程? 一般可以通过两种方式: 1.通过PID 所有的子进程在创建完成后都会有相应的PID,将这些个PID存到本地的表中,需要时通过PID去访问进程。 2.通过进程名 在注册一个进程的...2012-03-29 18:16:42 · 947 阅读 · 0 评论