今天演示,如何利用shell和erlang通过socket进行通信,希望能对大家有所启发。

    服务端由erlang设计的一个支持并发的取整服务器,客户端由shell脚本实现(当然,其他动态语言做起来也很方便,这里有个目的就是介绍shell脚本的扩展应用)。客户端发送一个浮点数,服务端处理后返回相应的整数。这里只是一个引子,希望看到的朋友可以自己去灵活应用。

服务器:

  1. %%---------------------------------------------------- 
  2. %% @doc 取整服务器 
  3. %%---------------------------------------------------- 
  4. -module(integer). 
  5. -author('bloodiron888@gmail.com'). 
  6. -compile([export_all]). 
  7.  
  8. listen() -> 
  9.     {ok, L} = gen_tcp:listen(9060, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]), 
  10.     do_accept(L). 
  11.  
  12. %% @doc 多连接支持 
  13. do_accept(L) -> 
  14.     {ok, S} = gen_tcp:accept(L), 
  15.     io:format("client connect: ~w~n", [S]), 
  16.     spawn(fun() -> do_echo(S) end), 
  17.     do_accept(L). 
  18.  
  19. do_echo(S) -> 
  20.     case gen_tcp:recv(S, 0) of 
  21.         {ok, Data} -> 
  22.             Reply = anlysis(Data), 
  23.             gen_tcp:send(S, Reply), 
  24.             do_echo(S); 
  25.         {error, closed} -> ok 
  26.     end
  27.  
  28. %% @doc 分析数据 
  29. anlysis(Data) when is_binary(Data) -> 
  30.     Request = binary_to_atom(Data, utf8), 
  31.     io:format("request ~w~n", [Request]), 
  32.     case catch list_to_float(atom_to_list(Request)) of 
  33.         {'EXIT', _} -> <<"error, data_type">>; 
  34.         Number when is_float(Number) -> 
  35.                 %%Raw = io_lib:format("~w", [round(Number)]), 
  36.                 Raw = io_lib:format("~w~n", [trunc(Number)]), 
  37.                 list_to_binary(Raw); 
  38.         _ -> <<>> 
  39.     end

编译并启动服务器:

  1. [linux]$ erl -make integer.erl 
  2. [linux]$ erl -s integer listen 

客户端:

  1. #!/bin/bash 
  2. # filename:cl.sh
  3. exec 8<> /dev/tcp/211.211.23.67/9060 
  4. echo -n $1 >&8 
  5. echo 
  6. cat <&8 & 

使用:

  1. chmod +x cl.sh 
  2. ./cl.sh 8.9 
  3. 网络通信正确连接后,服务端会返回 8 

具体的语法和规则,我这里不做说明,都可以找到文档。客户端可以查看/proc/self/fd/目录确定连接是否成功。

   今天这篇文章,主要是为了给有一定开发技术基础的运维或者linux系统工程师一些启发,便于他们在实际工作中应用。

   以后的文章会演示,如何从一个最简单的tcp服务器,慢慢扩展构建一个gen_server类型的通用网络服务器,最后再打包为一个独立的application(应用)。