Erlang简易文件服务器和客户端

来自《Erlang程序设计》,该程序包含了Erlang中最基本的消息传递,模式匹配等要素。

Server端

 1 -module(afile_server).
 2 -export([start/1, loop/1]).
 3 
 4 start(Dir) -> spawn(afile_server, loop, [Dir]).
 5 
 6 loop(Dir) ->
 7     receive
 8         {Client, list_dir} ->
 9             Client ! {self(), file:list_dir(Dir)};
10         {Client, {get_file, File}} ->
11             Full = filename:join(Dir, File),
12             Client ! {self(), file:read_file(Full)}
13         end,
14         loop(Dir).

首先调用afile_server:start()运行Server进程,并保存其返回的Pid供客户端使用。Server中只匹配list_dir和get_file两种消息,分别返回指定目录下的文件和文件内容。

Client端

 1 -module(afile_client).
 2 -export([ls/1, get_file/2]).
 3 
 4 ls(Server) ->
 5     Server ! {self(), list_dir},
 6     receive
 7         {Server, List} ->
 8             List
 9     end.
10     
11 get_file(Server, File) ->
12     Server ! {self(), {get_file, File}},
13     receive
14         {Server, Content} ->
15             Content
16     end.

Client端以Server端Pid为参数,ls()函数会发送list_dir原子给服务器,等待返回的消息。

get_file()函数以Server端Pid和文件名为消息,等待返回的文件内容。

 

首先编译

Erlang/OTP 17 [erts-6.0] [64-bit] [smp:4:4] [async-threads:10]

Eshell V6.0  (abort with ^G)
1> c(afile_server).
{ok,afile_server}
2> c(afile_client).
{ok,afile_client}

开启Server

3> Server = afile_server:start(".").
<0.44.0>

Client

4> afile_client:ls(Server).                 
{ok,["afile_client.beam","afile_client.erl",
     "afile_server.beam","afile_server.erl","Hello.txt",
     "include","lib","min.beam","min.erl","reverse.beam",
     "reverse.erl"]}
5> afile_client:get_file(Server, "Hello.txt").
{ok,<<"Hello,Erlang.">>}

 

posted @ 2014-06-20 15:38  Xilzzerts  阅读(301)  评论(0)    收藏  举报