lb20309 发表于 2018-8-21 12:09:08

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]
查看完整版本: erlang与shell 通过socket通信