Erlang OTP UDP服务器
下面是一个简单的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)
-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的类似模型。为一个示例:
rebar
,则可以使用命令rebar create template=simplesrv srvid=your_server_name
添加样板函数init/1
函数。(初始化是genu服务器
行为所必需的。您也可以在那里启动循环/1
功能terminate/2
功能关闭loop/1
函数的请求的业务逻辑移动到模块中的handle\u call/3
或handle\u cast/2
(见下文)genu-server:cast/2
(如果您不关心响应)或genu-server:call/2,3
(如果您关心响应)。转换或调用将由模块中的handle\u cast/2
或handle\u call/3
函数处理
强制转换本质上是无阻塞的,因此,它的答案是有一个良好的设计模式,用于在gen\u服务器中异步处理调用操作。你可以从中取笑