erlang与shell 通过socket通信
今天演示,如何利用shell和erlang通过socket进行通信,希望能对大家有所启发。服务端由erlang设计的一个支持并发的取整服务器,客户端由shell脚本实现(当然,其他动态语言做起来也很方便,这里有个目的就是介绍shell脚本的扩展应用)。客户端发送一个浮点数,服务端处理后返回相应的整数。这里只是一个引子,希望看到的朋友可以自己去灵活应用。
服务器:
[*]%%----------------------------------------------------
[*]%% @doc 取整服务器
[*]%%----------------------------------------------------
[*]-module(integer).
[*]-author('bloodiron888@gmail.com').
[*]-compile().
[*]
[*]listen() ->
[*] {ok, L} = gen_tcp:listen(9060, ),
[*] do_accept(L).
[*]
[*]%% @doc 多连接支持
[*]do_accept(L) ->
[*] {ok, S} = gen_tcp:accept(L),
[*] io:format("client connect: ~w~n", ),
[*] 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", ),
[*] case catch list_to_float(atom_to_list(Request)) of
[*] {'EXIT', _} -> ;
[*] Number when is_float(Number) ->
[*] %%Raw = io_lib:format("~w", ),
[*] Raw = io_lib:format("~w~n", ),
[*] list_to_binary(Raw);
[*] _ ->
[*] end.
编译并启动服务器:
[*]$ erl -make integer.erl
[*]$ erl -s integer listen
客户端:
[*]#!/bin/bash
[*]# filename:cl.sh
[*]exec 8 /dev/tcp/211.211.23.67/9060
[*]echo -n $1 >&8
[*]echo
[*]cat
页:
[1]