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).
2011-04-20 03:58:18, 473 reviews, comment
send to mailbox
关于Erlang和Node.js的讨论网上已经有很多了,这里就比较激烈,shitou觉得elrang和node.js的最大缺别就在于erlang是language native process,不是OS level的process, 而node.js只是一个OS层面的封装,所以这也就决定了并发的处理有很大的不同,看这里
2011-03-01 02:44:22, 597 reviews, comment
近两个月没有更新博客了,为了证明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().
2010-12-23 21:31:37, 784 reviews, comment
Mochichat的新版本上线了,Erlang代码核心全部重写了,这次前端使用了Rails, 数据库采用的MongoDB
架构:
目前可能还存在bug, 而且页面也比较简单,还需要改善
测试地址: 摸我
2010-07-01 15:03:34, 925 reviews, comment
MochiChat, 最近用Erlang写的一个基于Mochiweb的web聊天室,暂定名为MochiChat吧,特点有:
2010-05-20 16:44:16, 1370 reviews, comment
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.
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"
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
2010-04-24 17:31:59, 1173 reviews, comment
少年,不点下广告吗!
all by shitou
blog comments powered by Disqus