Erlang脚本不将数据发送回客户端

时间:2017-01-19 09:21:22

标签: sockets erlang

我是erlang语言的新手,并且有一个脚本可以接受来自客户端的数据并在日志中存储响应。我想在其中做一些修改,以便它可以将响应发送回客户端。我试过放牧场:发送(插座,数据);在http_pool中写入ladger.info但错误即将发生。请帮忙

-define(POOL, ?MODULE).

init() ->
  ok = hackney_pool:start_pool(?POOL, [
    {timeout, 150000},
    {max_connections, avant_app:env(api_pool_size)}
  ]),
  ok.

request(Binary) ->
  URL = avant_app:env(api_url),
  Headers = [],
  Payload = { form, [{ <<"data">>, Binary }] },
  Options = [
    {connect_options, [ binary ]},
    {pool, ?POOL}
  ],
  {ok, 200, _RespHeaders, ClientRef} = hackney:request(post, URL, Headers, Payload, Options),
  { ok, Body } = hackney:body(ClientRef),
  lager:info("Body ~p", [ Body ]),
  ok.

http_pool

-behaviour(ranch_protocol).

-export([
  start_link/4,init/4
]).

-record(state, {
  socket :: reference(),
  transport :: module(),
  rest = <<>> :: binary()
}).

start_link(Ref, Socket, Transport, Opts) ->
    Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
    {ok, Pid}.

init(Ref, Socket, Transport, _Opts = []) ->
    ok = ranch:accept_ack(Ref),
    loop(#state{
      socket = Socket,
    transport = Transport
    }).

loop(State = #state{ transport = Transport, socket = Socket }) ->
  case parse(State) of
    { ok, Str, NewState } ->
      queue_server:add(Str),
      loop(NewState);
    { nothing, NewState } ->
      case Transport:recv(Socket, 0, 60000) of
        {ok, Data} ->
              lager:info("i got ~p", [ Data ]),
          loop(NewState#state{ rest = <<(NewState#state.rest)/binary, Data/binary>> });
        { error, timeout } ->
          loop(NewState);
        _Any ->
          %%lager:info("Socket ~p", [ Any ]),
          ok = Transport:close(Socket)
      end;
    {exit, _Reason } ->
      ok = Transport:close(Socket)
  end.

parse(State) ->
  parse(State#state.rest, State).

parse(<<>>, State) -> { nothing, State#state{ rest = <<>> }};
parse(<<"S", _/binary>> = Packet, State) ->
  case binary:split(Packet, <<"END">>) of
    [ Str, Rest ] ->
      { ok, <<Str/binary, "END">>, State#state{
        rest = Rest
      }};
    [ Rest ] ->
      { nothing, State#state{
        rest = Rest
      }}
  end;
parse(Data, State) ->
  case binary:split(Data, <<"END">>) of
    [ _, Rest ] ->
      parse(<<"END", Rest/binary>>, State);
    [ _Rest ] ->
      parse(<<>>, State)
  end.
?

0 个答案:

没有答案
相关问题