Erlang OTP UDP服务器

Erlang OTP UDP服务器,erlang,udp,Erlang,Udp,下面是一个简单的UDP服务器: -module(kvstore_udpserver). -author("mylesmcdonnell"). %% API -export([start/0]). start() -> spawn(fun() -> server(2346) end). server(Port) -> {ok, Socket} = gen_udp:open(Port, [binary]), loop(Socket). loop(Socket)

下面是一个简单的UDP服务器:

-module(kvstore_udpserver).
-author("mylesmcdonnell").

%% API
-export([start/0]).

start() ->
  spawn(fun() -> server(2346) end).

server(Port) ->
  {ok, Socket} = gen_udp:open(Port, [binary]),
  loop(Socket).

loop(Socket) ->
  receive
    {udp, Socket, Host, Port, Bin} ->
      case binary_to_term(Bin) of
        {store, Value} ->
          io:format("kvstore_udpserver:{store, Value}~n"),
          gen_udp:send(Socket,Host,Port,term_to_binary(kvstore:store(Value)));
        {retrieve, Key} ->
          io:format("kvstore_udpserver:{retrieve, Value}~n"),
          gen_udp:send(Socket,Host,Port,term_to_binary(kvstore:retrieve(Key)))
      end,
      loop(Socket)
  end.
我该如何重组它,以便

a) 它,或者至少是它的相关部分,是一个gen_服务器,因此我可以将其添加到监控树中

b) 通过在单独的进程中处理每条消息来提高并发性

我已经从Learn You Some Erlang为我的TCP服务器重新实现了sockserv示例,但我正在努力确定UDP的类似模型。

为一个示例:

  • 您需要关注genu服务器的行为,并实现所有回调函数(这是显而易见的,但值得明确调用)。如果已安装
    rebar
    ,则可以使用命令
    rebar create template=simplesrv srvid=your_server_name
    添加样板函数

  • 您可能希望将服务器启动业务逻辑(gen_udp:open/2调用)移动到服务器的
    init/1
    函数。(初始化是
    genu服务器
    行为所必需的。您也可以在那里启动
    循环/1
    功能

  • 您可能需要确保udp服务器被模块的
    terminate/2
    功能关闭

  • 将处理从解析消息到
    loop/1
    函数的请求的业务逻辑移动到模块中的
    handle\u call/3
    handle\u cast/2
    (见下文)

  • 对于b): 您有几个选项,但基本上,无论何时收到消息,都可以使用
    genu-server:cast/2
    (如果您不关心响应)或
    genu-server:call/2,3
    (如果您关心响应)。转换或调用将由模块中的
    handle\u cast/2
    handle\u call/3
    函数处理

    强制转换本质上是无阻塞的,因此,它的答案是有一个良好的设计模式,用于在
    gen\u服务器中异步处理调用操作。你可以从中取笑