随笔分类 -  erlang

Erlang 聊天室程序(十一) 主题房间之Supervisor引起的改造
摘要:于由使用了Supervisor来管理当前所有的房间,每个房间都为单独的进程,所以要计对之前的chat_room.erl代码做相应的修改。 具体包括以下几点: 1.getPid/0 : 以前是由{local,?Module}房间进程来产生新的客户端进程。这次由于采用simple_one_to_one的启动方式,所以要重新指定客户端进程的产生方式(这里交由大厅来创建) 所以修改chat_room进程的创建方法,房间名由外部传入,再根据房间名为每个chat_room进程命名。start_link(Para)->#roominfo{name=Name,type=Type}=Para,... 阅读全文

posted @ 2012-04-05 16:43 心笑峰 阅读(1061) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序(十) 主题房间3 ---创建、关闭和查询
摘要:为了后面的功能,这里先实现主题房间的开启、关闭和查询。这些都是对客户端行为的响应,正常情况下需要管理员权限,由于权限部分还未实现所以这里暂时不考虑。 先定义消息格式: 开启: #message{type="set",subject="openroom",content=#roominfo{type="type",name="name"}} #message{type="result",subject="openroom",content="succ/failed&q 阅读全文

posted @ 2012-03-13 19:10 心笑峰 阅读(917) 评论(0) 推荐(1) 编辑

Erlang 聊天室程序(九) 主题房间2 ---房间信息管理
摘要:接着上一篇,这次处理“维护当前可用的主题房间信息”问题。 每次使用startChild启动子进程的时候将当前的房间信息保存到ets表中。更重要的是每次主题房异常退出或重启都要更新对应的信息。 修改room_manager.erl中的内容:新建一个函数来初始化房间信息表:initTab()->ets:new(roominfo,[public,ordered_set,named_table,{keypos,#roominfo.id}]).再添加对房间表数据操作的方法:addRoomInfo(Record)->#roominfo{name=Name,type=Type}=Record,c 阅读全文

posted @ 2012-03-10 18:51 心笑峰 阅读(938) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序(八) 主题房间---supervisor 的使用
摘要:之前实现的功能相当于一个大厅,这里我们为这个聊天室程序添加“主题房间的功能”。客户端登陆后处于大厅中,然后获取目前所有的主题房间,再发送消息进入到某个房间内。同一房间的成员可见,发送的消息也只限本房间可见。 为了管理这些房间,Erlang Opt中的监控树是最合适的。 新建一个模块room_manager.erl 其行为遵守gen_supervisor,子进程为chat_roominit(Para)-> {ok, { {one_for_one,3,5}, [ {the_room, {chat_room,start_link,[]}, pe... 阅读全文

posted @ 2012-03-02 18:03 心笑峰 阅读(1800) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序(七) 获取在线用户
摘要:先定义消息格式如下: 请求: #message{type="get",subject="clientinfo",content="all"} 响应:#message{type="result",subject="clientinfo",content=[#clientinfo,#clientinfo,.....]} 修改客户端发送请求消息部分:clientThread.sendMsg(new Message("get","client","&qu 阅读全文

posted @ 2012-03-02 14:12 心笑峰 阅读(936) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序(五) 设置客户端信息
摘要:接下来实现设置客户端信息功能,使客户端可以设置自己的名称、性别、年龄、所做省份等信息。我们暂时不管客户端如何实现,先对服务器端代码进行调整。 这里需要做以下几件事: 1.修改client_session中handle_info({tcp,Socket,Data},State) 函数对接收到的消息包的处理,使其能支持“客户端信息设置消息”。 考虑到后面还会有更多种类的消息,在这里添加一个消息路由模块message_router.erl,主要负责验证收到的消息类型和主题,并最终路由到正确的消息处理模块中去。 2.将chat_room中的客户端信息管理代码独立为一个client_manager.e. 阅读全文

posted @ 2012-02-28 17:30 心笑峰 阅读(800) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序(四) 数据交换格式---json的encode
摘要:上一篇实现了json数据到message记录的转换,这篇则是将message还原为json以便发送给客户端。 首先完善上篇中creationDate部分的解析:para({"creationDate",Val},Data)-> {obj,List}=Val, Time=#time{}, NewData1=Data#message{time=Time}, NewData=paraEle(List,NewData1);para({"date",Val},Data) when is_integer(Val)-> io:format("pa 阅读全文

posted @ 2012-02-27 21:03 心笑峰 阅读(1575) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序(三) 数据交换格式---json的decode
摘要:霸哥的blog中提到过Erlang服务器在通信中与客户端的数据交换方式:yufeng 为了简单起见这个聊天室程序采用json,要使用到rfc4627这个库 先定义一个Message类:public class Message { String id; //消息ID String type; //消息类型 String from; //发送方 String to; //接收方 String subject; //主题 String content; //内容 Date creationDate; //时间 public Message(String type,String fro... 阅读全文

posted @ 2012-02-27 18:29 心笑峰 阅读(1413) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序(二) 客户端的退出
摘要:接着上一篇Erlang 聊天室程序(一) 。客户端退出会导致服务器端异常退出。 异常信息如下:client sockt closed ** exception exit: {bad_return_value,true} 显然已经在client_session的 handle_info({tcp_closed,Socket},State) 中捕捉到了Socket断链信息。handle_info({tcp_closed,Socket},State)-> io:format("client sockt closed ~n"), chat_room:logout(State) 阅读全文

posted @ 2012-02-25 13:01 心笑峰 阅读(1372) 评论(0) 推荐(0) 编辑

Erlang 聊天室程序( 一)
摘要:为了熟悉Erlang的套接字编程开始编写一个“聊天室”程序。基本流程如下: 1.服务器启动监听指定端口 2.启动一个gen_server 作为聊天室进程,里面使用ets 保持当前所有客户端连接信息,并负责将某个客户端的消息广播到所有在线客户端 3.服务器接受客户端连接,并绑定到一个gen_server进程 4.客户端维护进程接受客户端发送的消息,调用聊天室进程函数进行广播 5.客户端维护进程接受聊天室发送的消息,转发给客户端 客户端信息包括id、pid、socket、nickname、sex、age、province 等。 目前包括以下几个模块: echatServer.erl :服务器端程. 阅读全文

posted @ 2012-02-24 16:01 心笑峰 阅读(4214) 评论(4) 推荐(4) 编辑

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_link(Mod, Args, Options) -> gen:start(?MODULE, link, Mod, Args, Options). start_link(Name, Mod, Args, Options... 阅读全文

posted @ 2012-02-24 11:32 心笑峰 阅读(4104) 评论(1) 推荐(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). %% %% Include files %% %% %% Exported Functions %% -export([start_link/0,getnewid/1]). -export([init/1.. 阅读全文

posted @ 2012-02-17 17:57 心笑峰 阅读(522) 评论(0) 推荐(0) 编辑

Erlang 从URL中截取尾部文件名
摘要:分析项目edownloader时看到的代码: 从 “http://www.aaaa.com.cn/download/bbb/ccc.exe” 中截取ccc.exeuri.hrl-record(uri, {scheme, %% "http", "ftp" user_info="", %% [] | "srp" host="", %% "somewhere.net" port="", %% [] | 80 | 8080 path="", . 阅读全文

posted @ 2012-02-16 16:02 心笑峰 阅读(901) 评论(0) 推荐(0) 编辑

Erlide 的安装使用
摘要:erlang 开发平台很少,做JAVA开发的人做erlang开发,肯定会怀念eclipse中的快捷键操作,配置调试,语法高亮等。Erlide则是这么一款基于eclipse 的erlang开发插件,目前的版本是0.13.9 安装步骤如下: 1.安装erlang开发环境(版本至少为R13B-5) 2.安装eclipse 3.eclipse-->help--->install new Software ,填入http://www.erlide.org/update 安装。展开获取的安装项,里面会有Erlang add-ins、Erlang IDE 和Erlang optional add 阅读全文

posted @ 2012-02-16 12:10 心笑峰 阅读(3831) 评论(0) 推荐(0) 编辑

erlang socket
摘要:目标是验证“将客户端连接的socket绑定到一个gen_server后,发送到socket 的消息将由gen_server的handle_info/2 处理”。 接收客户端socket 连接的server:-module("myserver"). -export([start/2],[stop/0]). start()-> %%监听端口 {ok,ListenSocket}=gen_tcp:listen(1234,[binary,{packet,4}, {reuseaddr,true}, {active,true}]), %%获取客户端链接 {ok,Socket} =. 阅读全文

posted @ 2011-11-27 17:03 心笑峰 阅读(3272) 评论(0) 推荐(0) 编辑

HotWheels
摘要:启动过程: make run1 run1在MakeFile中的定义: run1: compile erl $(LOCAL_OPTS) -name $(NODE) -s janus startjanus.erl内容:start() -> start([]).start([]) -> start(8081);start([Port]) when is_atom(Port) -> start(list_to_integer(atom_to_list(Port)));start(Port) when is_integer(Port) -> inets:start(),... 阅读全文

posted @ 2011-11-10 20:22 心笑峰 阅读(455) 评论(0) 推荐(0) 编辑

erlang debug 调试
摘要:erlang 提供了一个debugger 调试工具,可以用来单步调试自己的代码。可以在shell 中输入im() 或 debugger:start() 来调出。首先打开的是一个Monitor 窗口:在这里可以选择要调试的代码:选择Module--> Interpret。注意调试的文件必须要通过debug_info 的方式进行编译: c(module.erl,debug_info)点击后出现第二个窗口IntepretDialog:可以在Directories中选择调试文件所在目录,在右侧Files中选择要调试的代码文件。选择后在Monitor 窗口中就会出现选择的文件,可以双击打开View 阅读全文

posted @ 2011-10-25 21:30 心笑峰 阅读(4900) 评论(0) 推荐(0) 编辑

erlang(2) gen_server
摘要:通过前面的erlang(1)我们了解到了一个基本的服务器的实现方法。erlang中为我们提供了这样一个服务器的现成的实现,就是gen_server,不用自己去编写服务器程序了。所要做的就是以下几个事:1.确定我们回调模块的名称2.编写接口函数3.实现六个回调方法也就是说我们只需要关注于回调模块的实现就OK了。1: -module(XXXX) 定义模块名称2:接口函数,可供调用的函数。 在这里你可以定义所有需要的方法,作为功能调用的入口。 例如常见的start()、stop()等。他们的作用就是调用gen_server,完成指定功能。3:实现回调函数,一共需要实现六个。 init()/1 --- 阅读全文

posted @ 2011-09-13 21:00 心笑峰 阅读(1201) 评论(0) 推荐(0) 编辑

erlang(1)
摘要:%%server1.erl: -module(server1) -export([start/2,rpc/2]) start(Name,Mod)-> register(Name,spawn(fun()->loop(Name,Mod,Mod:init())end)). rpc(Name,Request)-> Name!{self(),Request}, receive {Name,Response}->Response end. loop(Name,Mod,State)-> receive {From,Request}-> {Re... 阅读全文

posted @ 2011-09-05 22:53 心笑峰 阅读(834) 评论(1) 推荐(1) 编辑

导航