`
rstevens
  • 浏览: 95888 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang学习: 基于gen_server的echoserver及监控模块

阅读更多
第一版基础上,将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.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    gen_server tasting 之超简单名称服务(续)

    在IT行业中,`gen_server`是Erlang OTP(开放电信平台)框架中的一个核心组件,它提供了一种模式化的方式来实现服务器进程。本篇博客“gen_server tasting 之超简单名称服务(续)”主要探讨了如何使用gen_server来...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang的设计灵感来源于通信领域的实际需求,其并发模型基于轻量级进程(processes),这些进程之间的通信是通过消息传递来实现的,这使得Erlang在处理大量并发连接时表现出色。OTP则在此基础上,提供了强大的行为...

    gen_server:Erlang 的 gen_server 的(不完整的)OcamlAsync 实现

    《Erlang gen_server在OcamlAsync中的实现探索》 Erlang的gen_server是其并发模型的核心组件,它提供了一种强大的状态管理和错误处理机制。而在OCaml语言中,尽管有着自己的并发库如Async,但直接移植或模仿Erlang...

    基于Erlang的gen_tcp聊天室代码,功能完整

    总的来说,这个基于Erlang的gen_tcp聊天室项目是学习并发编程和网络通信的良好实践。通过阅读和分析源代码,我们可以深入理解Erlang的并发特性、gen_tcp的使用方法,以及如何构建分布式、实时的聊天应用。

    gen_tcp_server:Erlang 应用程序的通用 TCP 服务器

    通用 TCP 服务器 通用 TCP 服务器( gen_tcp_server ) 是一种 Erlang 行为,提供快速简便的方法将 TCP 服务器功能添加到您的应用程序。 它被实现为管理 TCP 连接的主管,因为它是孩子。如何使用它? 运行make来构建。...

    gen_server tasting 之超简单名称服务

    在Erlang编程语言中,`gen_server`行为是一个强大的模块,用于构建具有状态的、容错的服务。这篇名为“gen_server tasting 之超简单名称服务”的博客文章可能介绍了如何利用`gen_server`来实现一个简单的命名服务。...

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...

    esl-erlang_23.0.2-1_centos_7_amd64.rpm

    erlang_23.0.2-1版本 centos7 64bit esl-erlang_23.0.2-1_centos_7_amd64.rpm

    erlang-gen_tcp手册

    erlang-gen_tcp手册,详细完整,网络tcp开发好东东

    erlang 聊天室

    在本文中,我们将深入探讨如何使用Erlang构建一个简易的聊天室,主要涉及的关键技术是gen_tcp和gen_server。Erlang是一种并发性极强、面向进程的编程语言,特别适合于构建高可用性和可扩展性的分布式系统,如聊天室...

    esl-erlang_23.0_windows_amd64.exe

    这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载

    erlang_otp_src_17.3.tar.gz

    7. **行为模块**:如gen_server、gen_event、gen_fsm等,是OTP设计模式的具体实现,简化了编写服务器、事件处理器和有限状态机的代码。 关于压缩包内的"otp_src_17.3",这是Erlang OTP 17.3版本的源代码目录。为了...

    erlang_otp_win64_25.0

    Erlang OTP (Open Telephony Platform) 是一种高级并发编程语言和框架,主要由瑞典电信设备制造商Ericsson开发,用于构建高度可靠、可扩展和实时的分布式系统。Erlang OTP 25.0是该平台的一个版本,特别针对Windows ...

    erlang_otp_22.2_win64&rabbitmq-server-3.8.3.zip

    标题中的"erlang_otp_22.2_win64"和"rabbitmq-server-3.8.3"提到了两个关键的IT技术:Erlang OTP和RabbitMQ服务器,这两个都是在分布式系统和消息队列领域非常重要的组件。 **Erlang OTP** Erlang是一种函数式编程...

    gen_server tasting 之超简单名称服务(再续)

    在IT行业中,`gen_server` 是Erlang OTP(开放电信平台)框架中的一个核心行为模块,用于构建可靠且容错的服务。它提供了一种模式,使得开发者可以编写并发、状态管理和故障恢复的服务器进程。在"gen_server tasting...

    使用OTP原理构建一个非阻塞的TCP服务器

    - **tcp_client_sup模块**: 实现gen_server行为,作为客户端管理器,负责启动和监控tcp_echo_fsm进程。 - **tcp_echo_fsm模块**: 实现gen_fsm行为,处理客户端的TCP连接,接收和发送数据。 在gen_server和gen_fsm中...

    erlang tcp_server

    4. **gen_tcp模块**:这个模块提供了处理TCP连接的函数,如`gen_tcp:connect/3`用于建立客户端连接,`gen_tcp:recv/2,3`用于接收数据,`gen_tcp:send/2`用于发送数据,以及`gen_tcp:close/1`用于关闭连接。...

    esl-erlang_20.3-1_centos_6_amd64.rpm

    esl-erlang_20.3-1_centos_6_amd64.rpm 10.7.1版本

    Erlang-Formula.zip_Erlang B _Erlang-B_erlang_erlang B计算_erlang C

    Erlang B 和 Erlang C 是在电信领域中广泛使用的两个数学公式,用于预测和管理电话交换系统的呼叫处理能力。这两个公式由丹麦工程师 Agner Krarup Erlang 在20世纪初开发,对于理解通信系统中的呼叫占用率、阻塞率和...

Global site tag (gtag.js) - Google Analytics