`
fsword
  • 浏览: 169093 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Erlang新手进阶笔记(1) - 一个简单的服务器示例

阅读更多
~~~~~华丽的分割线~~~~

最近老赵对C#和java进行比较的一篇博客引起了很多人的关注,但是我并不是很同意这个角度,我一直认为,一把钥匙一把锁,有明确针对性的语言是好语言,例如 erlang 之于分布式高可靠性系统,ruby 之于DSL类应用


学习Erlang的过程中,感觉它的语法其实很简单,比较强大的是它针对分布式系统所建构的基础设施,这个在语言层面和类层面都有考虑,这个系列blog就是我的学习总结。

~~~~~华丽的分割线~~~~


erlang更适合分布式服务端开发,让我们从一个服务器程序写起——
% my_server1.erl %
-module(my_server1).
-export([start/0]).

start() -> spawn(fun() -> loop() end).

loop() -> 
    receive
        Request -> 
            io:format("server1,~p~n",[Request]),
            loop()
    end.


服务器需要对调用方进行响应,于是改造为
% my_server2.erl %
-module(my_server2).
-export([start/0]).

start() -> spawn(fun() -> loop() end).

loop() -> 
    receive
        {callback,From,Request} -> 
            io:format("server 2,~p~n",[Request]),
            From ! Request,
            loop()
    end.


编写一个client测试一下
% my_client %
-module(my_client).
-export([start/0]).

start() -> spawn(fun() -> loop() end).

loop() ->
    receive
        Msg -> io:format("client - ~p~n",[Msg])
    end.


执行测试

Eshell V5.7.2  (abort with ^G)
1> c(my_server2),c(my_client).
{ok,my_client}
2> C = my_client:start(),S = my_server2:start().

3> S ! { callback, C, "hello" }.
server 2,"hello"
{callback,<0.88.0>,"hello"}
client - "hello"


这就是一个初级版本的服务器,可以看出,无论是开发还是测试,erlang写的代码都很简单。

这个服务器还很简陋的,例如,我们不能“优雅的”停止它。

那么怎样算是"优雅的"停止一个服务器?打个比方,对一个已经启动了的PC,直接拔掉电源就是“粗暴的”,而点击"开始" - “关机”,让windows自己关闭就是优雅的——这样,windows自己会决定如何释放资源,如何保护旧数据等等。

其实,服务器的所谓停止,骨子里也只是接受到了一个stop消息,真正的停止行为还是服务器自己完成的。“消息“?不错,其实就是一次receive

看代码:

% my_server3.erl %
-module(my_server3).
-export([start/0]).

start() -> spawn(fun() -> loop() end).

loop() -> 
    receive
        {callback,From,Request} -> 
            Response = deal_with(Request),
            From ! Response,
            loop();
        {stop} ->
            io:format("server3 stopped~n")
    end.

deal_with(Request) ->
    io:format("server3 - ~p~n",[Request]),
    "response".


进行测试

Eshell V5.7.2  (abort with ^G)
1> c(my_server3),c(my_client).
{ok,my_client}
2> C = my_client:start(),S = my_server3:start().
<0.45.0>
3> S ! { callback, C, "hello" }.
server3 - "hello"
{callback,<0.44.0>,"hello"}
client - "response"
4> S ! {stop}.
server3 stopped
{stop}


现在看起来有点像个服务器了
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics