第一版基础上,将echoserver融入OTP:gen_server框架
同时引入OPT:supervisor行为包,实现对 echoserver的监控模块
当 echoserver退出后,监控模块master可以重启之。
erlang的监控树绝对是精华所在,解决了分布式开发的一个重要的问题域
-module(es2).
-behavior(gen_server).
-export([start_link/0, stop/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-export([server_loop/2, handle_connect/3]).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
stop() ->
gen_server:cast(?MODULE, stop).
init([]) ->
process_flag(trap_exit, true),
io:format("~p starting, ~p~n", [?MODULE, self()]),
{ok, ListenSocket} = gen_tcp:listen(1234, [binary, {reuseaddr, true}, {active, false}]),
register(echoserver, spawn(?MODULE, server_loop, [ListenSocket, 0])),
{ok, 0}.
terminate(_Reason, N) ->
io:format("~p stopping, ~p~n", [?MODULE, self()]),
ok.
handle_call(_Request, _From, _State) ->
{reply, 0, _State}.
handle_cast(stop, N) ->
echoserver ! {quit},
{stop, normal, N};
handle_cast(_Msg, N) ->
{noreply, N}.
handle_info(_Info, N) ->
{noreply, N}.
code_change(Old, N, Extra) ->
{ok, N}.
server_loop(ListenSocket, Count) ->
% 阻塞,等待连接
receive
{quit} ->
io:format("echoserver will stop~n"),
gen_tcp:close(ListenSocket);
{'EXIT', Pid, _Reason } ->
io:format("Child ~p exit~n", [Pid]),
server_loop(ListenSocket, Count);
_ ->
%io:format("recv ~p~n", Reason)
true
after 10 ->
case gen_tcp:accept(ListenSocket, 3000) of
{ok, Socket} ->
% 创建进程?
spawn(?MODULE, handle_connect, [Socket, [], Count]),
server_loop(ListenSocket, Count+1);
{error, timeout} ->
server_loop(ListenSocket, Count);
{error, Reason} ->
io:format("accept failed~n"),
gen_tcp:close(ListenSocket)
end
end.
handle_connect(Socket, BinaryList, Count) ->
io:format("handle_connect ~p~n", [self()]),
case gen_tcp:recv(Socket, 0) of
{ok, Binary} ->
% 继续接收数据
case gen_tcp:send(Socket, Binary) of
ok ->
handle_connect(Socket, BinaryList, Count);
{error, Reason} ->
io:format("send failed~n"),
gen_tcp:close(Socket)
end;
{error, timeout} ->
io:format("recv timeout~n"),
gen_tcp:close(Socket);
{error, closed} ->
% 直到对端关闭
io:format("peer closed~n"),
gen_tcp:close(Socket)
end.
-module(master).
-behavior(supervisor).
-export([start/0, stop/0, start_monitor/0]).
-export([init/1]).
%% 从shell运行的时候调用此函数
start() ->
%% 创建master进程
register(master, spawn(?MODULE, start_monitor, [])).
stop() ->
master ! {quit}.
start_monitor() ->
io:format("master started: ~p~n", [self()]),
%% 创建监控子进程,注册为monitor,并运行 init/1
{ok, Pid} = supervisor:start_link({local, monitor}, ?MODULE, []),
%unlink(Pid),
wait().
%% monitor进程运行init/1,启动所有被监控的子进程,并监控这些进程
init(FileName) ->
io:format("enter init, ~s, ~p~n", [FileName, self()]),
%% 运行 es2:start_link
ChildSpec = {es, {es2, start_link, []}, permanent, 2000, worker, [es2]},
%% 监控规范:被监控进程退出后,重启之,重启次数100,重启间隔10ms
{ok, {{one_for_one, 100, 10}, [ChildSpec]}}.
%% master进程循环等待退出消息
wait() ->
receive
{quit} ->
io:format("recv quit msg~n");
%%master进程退出,从而导致monitor及所有monitor的子进程都退出
{'EXIT', Pid, Reason} ->
io:format("Child ~p exit~n", [Pid]),
wait()
end.
分享到:
相关推荐
通用 TCP 服务器 通用 TCP 服务器( gen_tcp_server ) 是一种 Erlang 行为,提供快速简便的方法将 TCP 服务器功能添加到您的应用程序。 它被实现为管理 TCP 连接的主管,因为它是孩子。如何使用它? 运行make来构建。...
关于在 Erlang 风格的 gen_server 上进行 Ocaml/Async 尝试。
Erlang是一种通用的面向并发的编程语言,它有瑞典电信设备制造商爱立信所辖的CS-Lab开发, 目的是创造一种可以应对大规模并发活动的编程语言和运行环境。
erlang_23.0.2-1版本 centos7 64bit esl-erlang_23.0.2-1_centos_7_amd64.rpm
个人学习Erlang的时候自己写的一个基于gen_tcp的聊天室,功能有注册,登陆,获得登陆时间,聊天次数,上次登陆时间等等,资源里有完整代码,注释也很详细.
esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...
erlang-gen_tcp手册,详细完整,网络tcp开发好东东
erlang_otp_win64_25.0
这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载
erlang tcp_servererlang tcp_servererlang tcp_server
实现了Erlang B/C功能,支持大容量计算
erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册
Erlang opt_win64 20.2 windows exe 安装包 Erlang 20.2 is the upcoming version of Erlang For Windows x64 installer 截至2018.01.25 groovy最新最稳定版本
Gen_server实现了通用服务器client_server原理,几个不同的客户端去分享服务端管理的资源(如图),gen_server提供标准的接口函数和包含追踪功能以及错误报告来实现通用的服务器,同时可以作为OTP监控树的一部分。...
本资源是 适用于 linux centos 的 最新版 otp_src_21.3.tar.gz
RabbitMQ运行需要erlang环境,erlang22.1是windows64位的,适合RabbitMQ 3.7.*-3.8.*,官网下载速度极慢,下了很久才下下来,在这里分享给有需要的同学。
esl-erlang_19.3_osx_10.10_amd64.dmg
erlang_otp_22.2_win64.exe & rabbitmq-server-3.8.3.exe
erlang官网下载速度太慢了,无法忍受,erlang_otp_src_22.3.tar.gz+rabbitmq-server-3.8.3-1.el6.noarch.rpm
通过端口连接在Erlang / Elixir中制作nodejs gen_server的节点库。 该模块使您能够: 在Binary Erlang Term和javascript类型之间进行解码和编码 通过nodeJS可读和可写(双工)创建一个简单的Erlang端口接口 创建一...