shitou's blog 

  • Home
  • About
  • Feed
  • 十人族
  • MIX BOY
  • 塌客

Category "Erlang"

20
Apr

在gen_server中spawn新的进程

最近Joe在erlang mail lists中频繁现身,估计是因为许多人对gen_server的使用有很多误解,忍不住出来解救众生的...

其中Joe专门解释了怎样在gen_server中管理新的进程的问题 代码:
foo(X) ->
    gen_server:call(?Mod, {foo, X}).


%% Write a gen_server handle call method like this:

handle_call({foo, X}, From, State) ->
    State1 = func1(X, State),
    State2 = func2(X, State),
    spawn_link(fun() -> do_something(State1, X, From) end),
    {noreply, State2}.

do_something(State, X, From) ->
    Reply = func3(X, State),
    gen_server:reply(From, Reply).
上面的do_something可能是一个time-cost任务,为了不阻塞当前的gen_server进程,可以spawn一个新的进程来专门处理,do_something和当前gen_server进程会并行运行,gen_server会以State2继续运行,并且不会给client返回任何消息,client一直处于等待状态(因为这里是gen_server:call), do_something在处理完毕后会负责给client答复(gen_server:reply)

Tags: gen_server

2011-04-20 03:58:18, 473 reviews, comment

send to mailbox

Your email:

01
Mar

Erlang vs Node.js

关于Erlang和Node.js的讨论网上已经有很多了,这里就比较激烈,shitou觉得elrang和node.js的最大缺别就在于erlang是language native process,不是OS level的process, 而node.js只是一个OS层面的封装,所以这也就决定了并发的处理有很大的不同,看这里

Tags:

2011-03-01 02:44:22, 597 reviews, comment

send to mailbox

Your email:

23
Dec

Erlang OOP

近两个月没有更新博客了,为了证明shitou还活着,需要动动了..


前段时间刚换了工作,一直在忙,还有在和两个朋友业余时间开发一款SNS的WEB Game, 纸牌类的,架构就是JavaScript + Flash Socket + Erlang + MongoDB, 更多关于游戏的内容这里就不多透露了,上线时shitou会专门开贴广告宣传的,哈哈..

 

其实这半年时间除了在忙工作的事情之外shitou一直在关注web game方面的资料,之前尝试的C2C, SNS,感觉这块在国内独立开发者是很难做起来的,尤其是国内环境的影响....(省略2万字)

 

好了,下面开始正题,关于Erlang OOP(面向对象)特性

 

其实Erlang本身就是Function Language, 所谓OOP特性什么的都不是Erlang所强调的重点,Erlang帮主Joe在Erlang程序设计 一书中也一字未提Erlang的OOP内容,最近在用Erlang开发游戏的Socket Server时遇到其中一个模块设计如果用OOP的概念来做的话会更合适,想起了之前在mochiweb的源码中关于http request的解析module就是用的OOP的设计思路,回头再次查看mochiweb的源码,又google一翻,终于得到了解决办法,下面show一个简单的例子:

%oo.erl
-module(oo, [QS]).
-export([get_qs/0]).

new(Qs) ->
       instance(Qs).
get_qs() ->
       QS.

>A = oo:new("hello").
>A:get_qs().

Erlang的OOP功能算是Erlang的一个隐藏特性了,毕竟Erlang是一个函数编程语言,可能老乔(Joe)也不想提这方面的东西吧,关于更多的OOP特性,可以参考这篇文章PDF, 还可以看下mochiweb的源码.

Tags: Erlang,MongoDB

2010-12-23 21:31:37, 784 reviews, comment

send to mailbox

Your email:

01
Jul

Mochichat新版本上线

Mochichat的新版本上线了,Erlang代码核心全部重写了,这次前端使用了Rails, 数据库采用的MongoDB

 

架构:

http://www.ccok.me/photo/image/63/medium/Screen_shot_2010-07-01_at_3.09.23_PM.png

 

目前可能还存在bug, 而且页面也比较简单,还需要改善

 

测试地址: 摸我

 

 

 

 

Tags: MochiChat,MongoDB

2010-07-01 15:03:34, 925 reviews, comment

send to mailbox

Your email:

20
May

MochiChat: 一个基于erlang的web聊天室(beta)

MochiChat, 最近用Erlang写的一个基于Mochiweb的web聊天室,暂定名为MochiChat吧,特点有:

 

  • 采用Erlang,高并发,基于Mochiweb开发
  • 支持创建聊天室群聊

 

目前功能比较简单,核心功能就是聊天,不过以后扩展起来是比较简单的,测试地址是http://mochichat.ccok.me/
感兴趣的同学可以试下

 

开个专门的页面以后MochiChat相关的开发信息就在这里了

 

Tags: MochiChat,TCP

2010-05-20 16:44:16, 1370 reviews, comment

send to mailbox

Your email:

24
Apr

gen_tcp的packet参数

Erlang的gen_tcp模块packet可以指定多种参数,实现不同的数据解析方式,这里说一下line和http两种不同方式下解析的方式

代码:
-module(my_chat_server).
-export([start/1, start/0]).

start() -> start(8081).
start(Port) -> spawn_link(fun() -> start_listen(Port) end).
	
start_listen(Port) ->
       %here
	DefaultOptions = [{packet, line}, {active, false}, {reuseaddr, true}],
	case gen_tcp:listen(Port, DefaultOptions) of
		{ok, ListenSocket} ->
			par_connect(ListenSocket);
		{error, Reason} -> {error, Reason}
	end.
	
par_connect(LS) ->
	case gen_tcp:accept(LS) of
		{ok, Socket} ->
			spawn(fun() -> par_connect(LS) end),
			io:format("accept socket connection, socket=~w~n", [Socket]),
			loop(Socket);
		{error, Reason} -> {eorror, Reason}
	end.
	
loop(Socket) ->
	case gen_tcp:recv(Socket, 0) of
		{ok, Bin} ->
			%do with socket...
			io:format("deal socket data, socket=~w, data=~p~n", [Socket, Bin]),
			loop(Socket);
		{error, closed} ->
			io:format("socket closed, socket=~w~n", [Socket])
	end.

line:

erl中启动server:
>my_chat_server:start().
在浏览器中测试打开localhost:8081,这时可以看到erl console中可以看到输出:
2> my_chat_server:start().
<0.40.0>
accept socket connection, socket=#Port<0.1887>
deal socket data, socket=#Port<0.1887>, data="GET / HTTP/1.1\r\n"
deal socket data, socket=#Port<0.1887>, data="Host: localhost:8081\r\n"
deal socket data, socket=#Port<0.1887>, data="Connection: keep-alive\r\n"
deal socket data, socket=#Port<0.1887>, data="User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2\r\n"
deal socket data, socket=#Port<0.1887>, data="Cache-Control: max-age=0\r\n"
deal socket data, socket=#Port<0.1887>, data="Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
deal socket data, socket=#Port<0.1887>, data="Accept-Encoding: gzip,deflate,sdch\r\n"
deal socket data, socket=#Port<0.1887>, data="Accept-Language: en-US,en;q=0.8\r\n"
deal socket data, socket=#Port<0.1887>, data="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
deal socket data, socket=#Port<0.1887>, data="Cookie: AJSTAT_ok_times=1; _csuid=X4b5025bb3a94d53c; view_history=47451%2Cd7dad2a908d74be19d89cbfdb355d7bc%2C62cc19edb111424a98f22dd904ccd281%2Cd5cedcf1263542c790c46a158b77e5e8%2C9de94a4094184dff97a53afe3b2cfc94%2Cdb6c1cea4986466e98b290b26d62518b\r\n"
deal socket data, socket=#Port<0.1887>, data="\r\n"
也可以在shell中用telnet来测试:
#telnet localhost 8081

http:

修改代码中line为http,重新编译启动server,在浏览器中刷新可以看到:
1> my_chat_server:start().
<0.34.0>
accept socket connection, socket=#Port<0.440>
deal socket data, socket=#Port<0.440>, data={http_request,'GET',
                                             {abs_path,"/"},
                                             {1,1}}
deal socket data, socket=#Port<0.440>, data={http_header,14,'Host',undefined,
                                             "localhost:8081"}
deal socket data, socket=#Port<0.440>, data={http_header,2,'Connection',
                                             undefined,"keep-alive"}
deal socket data, socket=#Port<0.440>, data={http_header,24,'User-Agent',
                                             undefined,
                                             "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2"}
deal socket data, socket=#Port<0.440>, data={http_header,1,'Cache-Control',
                                             undefined,"max-age=0"}
deal socket data, socket=#Port<0.440>, data={http_header,8,'Accept',
                                             undefined,
                                             "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"}
deal socket data, socket=#Port<0.440>, data={http_header,10,
                                             'Accept-Encoding',undefined,
                                             "gzip,deflate,sdch"}
deal socket data, socket=#Port<0.440>, data={http_header,11,
                                             'Accept-Language',undefined,
                                             "en-US,en;q=0.8"}
deal socket data, socket=#Port<0.440>, data={http_header,9,'Accept-Charset',
                                             undefined,
                                             "ISO-8859-1,utf-8;q=0.7,*;q=0.3"}
deal socket data, socket=#Port<0.440>, data={http_header,50,'Cookie',
                                             undefined,
                                             "AJSTAT_ok_times=1; _csuid=X4b5025bb3a94d53c; view_history=47451%2Cd7dad2a908d74be19d89cbfdb355d7bc%2C62cc19edb111424a98f22dd904ccd281%2Cd5cedcf1263542c790c46a158b77e5e8%2C9de94a4094184dff97a53afe3b2cfc94%2Cdb6c1cea4986466e98b290b26d62518b"}
deal socket data, socket=#Port<0.440>, data=http_eoh
gen_tcp已经把数据以HTTP的方式解析,对于开发基于HTTP的应用来说非常方便,不过其实如果要开发HTTP应用的话使用mochiweb可能是更方便的实现方式

Tags: TCP

2010-04-24 17:31:59, 1173 reviews, comment

send to mailbox

Your email:

上一页 1 2 下一页

Tags

json Impactjs Canvas fun gen_server superfly PS3 Webgame HTML5 jquery SSH tenerer MooseFS gearman-ruby Gearman MongoDB MochiChat TCP U-ka saegusa IN db command Mai Kuraki Norah Jones log iPhoneException ACG Mac Safari objective-c CouchDB LVS AJAX debian 推荐 AMQP google mail bug gettext Erlang 北京 iptables 架构 tips mysql backup function 我看 postfix 监控 SEO cache Etag memcache thread 进程 线程 无锡 yield file column mixboy xml rss gems ruby shitou shell lighttpd 安全 csrf 公司 nginx linux 模块 apache webserver 朋友 大学 生活 尼古拉斯凯奇 movie 文件同步 笑笑 歌词 auto complete plugin rails music ubuntu blog

Category

  • HTML5[3]
  • iPhone[17]
  • Erlang[11]
  • google[13]
  • 生活[45]
  • 音乐[13]
  • 电影[11]
  • linux[29]
  • web server[6]
  • mail server[3]
  • cluster[1]
  • system manage[9]
  • ruby[20]
  • ruby on rails[28]
  • 开源[4]

Episode

  • MongoDB
  • MochiChat
  • iPhoneException
  • shell
  • thread
  • memcache


Popular Posts

  • 准备开始学习Erlang了(恶狼, 二郎..)
  • Ruby遍历MemCached的key
  • 服务器监控小脚本
  • MySQL Innodb备份
  • [转载]5个有用的ruby gems

Recommended Posts

  • Tri-survive - HTML5 Game
  • Cut the rope - HTML5版
  • json_formatter
  • 在gen_server中spawn新的进程
  • Superfly - Wildflowers
  • 继续凸墙 for Mac OS
  • MongoDB Beijing 2011
  • MongoDB删除map_reduce生成的tmp collection
  • Mai Kuraki - Future Kiss
  • Erlang OOP
  • 用SSH tunnel凸墙
  • Google的语法高亮工具包
  • 大量数据的批量操作
  • 再次被和谐-_-
  • 十人族: 上线了

Friends' blogs

  • levy
  • sphance
  • andreas
  • yangkunlun
  • {:dev=>:wxianfeng}
  • bheye
  • joeydarko

Login

   注册

留言 查看留言

留言

   取消

留言 查看留言


Statistics

  • 访问次数: 316257
  • 今天访问: 52
  • 日志: 213
  • 评论: 4967
  • 音乐: 9
  • 用户: 1758


少年,不点下广告吗!

 

all by shitou

blog comments powered by Disqus

close