今天演示,如何利用shell和erlang通过socket进行通信,希望能对大家有所启发。
服务端由erlang设计的一个支持并发的取整服务器,客户端由shell脚本实现(当然,其他动态语言做起来也很方便,这里有个目的就是介绍shell脚本的扩展应用)。客户端发送一个浮点数,服务端处理后返回相应的整数。这里只是一个引子,希望看到的朋友可以自己去灵活应用。
服务器:
- %%----------------------------------------------------
- %% @doc 取整服务器
- %%----------------------------------------------------
- -module(integer).
- -author('bloodiron888@gmail.com').
- -compile([export_all]).
- listen() ->
- {ok, L} = gen_tcp:listen(9060, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]),
- do_accept(L).
- %% @doc 多连接支持
- do_accept(L) ->
- {ok, S} = gen_tcp:accept(L),
- io:format("client connect: ~w~n", [S]),
- spawn(fun() -> do_echo(S) end),
- do_accept(L).
- do_echo(S) ->
- case gen_tcp:recv(S, 0) of
- {ok, Data} ->
- Reply = anlysis(Data),
- gen_tcp:send(S, Reply),
- do_echo(S);
- {error, closed} -> ok
- end.
- %% @doc 分析数据
- anlysis(Data) when is_binary(Data) ->
- Request = binary_to_atom(Data, utf8),
- io:format("request ~w~n", [Request]),
- case catch list_to_float(atom_to_list(Request)) of
- {'EXIT', _} -> <<"error, data_type">>;
- Number when is_float(Number) ->
- %%Raw = io_lib:format("~w", [round(Number)]),
- Raw = io_lib:format("~w~n", [trunc(Number)]),
- list_to_binary(Raw);
- _ -> <<>>
- end.
编译并启动服务器:
- [linux]$ erl -make integer.erl
- [linux]$ erl -s integer listen
客户端:
- #!/bin/bash
- # filename:cl.sh
- exec 8<> /dev/tcp/211.211.23.67/9060
- echo -n $1 >&8
- echo
- cat <&8 &
使用:
- chmod +x cl.sh
- ./cl.sh 8.9
- 网络通信正确连接后,服务端会返回 8
具体的语法和规则,我这里不做说明,都可以找到文档。客户端可以查看/proc/self/fd/目录确定连接是否成功。
今天这篇文章,主要是为了给有一定开发技术基础的运维或者linux系统工程师一些启发,便于他们在实际工作中应用。
以后的文章会演示,如何从一个最简单的tcp服务器,慢慢扩展构建一个gen_server类型的通用网络服务器,最后再打包为一个独立的application(应用)。