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

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

最近老赵[url=http://blog.zhaojie.me/2010/04/why-java-sucks-and-csharp-rocks-1-thoughts-and-goals.html]对C#和java进行比较的一篇博客[/url]引起了很多人的关注,但是我并不是很同意这个角度,我一直认为,一把钥匙一把锁,有明确针对性的语言是好语言,例如 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}


现在看起来有点像个服务器了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值