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.">>}

浙公网安备 33010602011771号