`

[代码分析]gen_server例子分析

 
阅读更多

这个例子是erlang/OTP并发实践里的 

例子内容很简单 但是对行为不是很理解的人(比如我)读起来还是有那么一点点困难的

 

源代码:

https://raw.github.com/erlware/Erlang-and-OTP-in-Action-Source/master/chapter_03/tr_server.erl

 

 

这边简化一下

do_rpc()那个函数其实就是运用下erlang:apply/3啦 前一篇的例子里有(\s和\\s在正则中一样??)

 

先讲个大概:

调用gen_server行为用 就可以了:

-behaviour(gen_server).

 接下去你使用gen_server中的函数一些函数时 他会自动调用模块内的一些函数

init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3

 针对代码里的

   gen_server:start/4 ----->init/1

   gen_server:call/2   ----->handle_call/3

   gen_server:cast/2  ----->handle_cast

 其他的通信(代码内主要是tcp链接)则会触发handle_info/2

 

主要流程如下:

 

 执行tr_server:start_link/1或者tr_server:start_link/0后(还可以通过tr_server:start_test/0)

 调用:

gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []).

 这段代码的意图是 绑定serverName,传入模块名和参数(这边是端口)

 

此后以上代码就会调用该模块内的init/1(这边的参数就是 gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []).中的Port(在init/1中使用了模式匹配得到了列表中的Port:init([Port])).对应关系如下:

gen_server: 写道
start(ServerName, Module, Args, Options) -> Result
Module:init(Args) -> Result

 

 

 

 

 

init/1:

init([Port]) ->
    {ok, LSock} = gen_tcp:listen(Port, [{active, true}]),
    {ok, #state{port = Port, lsock = LSock}, 0}.

 代码中新建一个tcp的服务 {active,true}代表有数据过来时自动把信息给对应的进程(这边会调用handle_info/2这个函数)

返回信息的格式如下:

写道
Result = {ok,State} | {ok,State,Timeout} | {ok,State,hibernate}
| {stop,Reason} | ignore
State = term()
Timeout = int()>=0 | infinity
Reason = term()

 那个State变量可以随意指定 这个State会传给handle_info/2,handle_call/3,handle_cast/2等(这些函数的返回值中返回的新的State可以用来更新)

返回中还有一个0代表着Timeout Timeout为0会立即触发以下函数:

handle_info(timeout, #state{lsock = LSock} = State) ->
    {ok, _Sock} = gen_tcp:accept(LSock),
    {noreply, State}.

等待TCP的一个连接(堵塞的,但开发者无需担心 这是在其他的进程中运行的)

 

从这里看出 这个应用其实只可以接受一个有效的telnet等连接。

连接建立好之后 所有的收发telnet信息等信息的工作交给了:

handle_info({tcp, Socket, RawData}, State) -> 
do_rpc(Socket, RawData), 
RequestCount = State#state.request_count, 
{noreply, State#state{request_count = RequestCount + 1}};

 负责处理数据并且更新下State

handle_info/2的第一个参数不是timeout就是发过来的信息,因为是处理telnet等的信息 所以用模式匹配就可以得到数据和对应的套接字(这个用来返回信息用)

 

 

其他的具体内容可以参考doc 以上内容也许分析有误 欢迎指正.

 

分享到:
评论

相关推荐

    webrtc_Linux源代码获取以及编译

    gn gen out/Default ninja -C out/Default ``` 五、例子程序 ------------ Webrtc 提供了多个示例程序,例如 PeerConnection、Setting up P2P calls between peerconnection_clients、Testing peerconnection_...

    erlang程序设计相关例子程序

    "server"暗示了它可能使用了Erlang的服务器模式(gen_server),这是一种常见的行为模式,用于构建状态管理服务。 6. **mylists.beam** - 类似于lib_misc,这个模块可能包含了对Erlang列表的特定操作,如过滤、映射...

    ERLANG和PYTHON互通实现过程详解

    `code_change/3`处理代码更新,这是一个gen_server回调,但在这个例子中没有实际的代码更新处理,所以返回{ok, State}。 Python脚本部分接收Erlang发送的数据流,并通过`stdin`处理输入。当接收到以"combine|"开头...

    erlang_standard_snippets-源码.rar

    8. **行为(Behaviours)**: Erlang的行为如gen_server、gen_event和gen_fsm,提供了标准的服务器、事件管理和有限状态机的实现框架。源码中可能会有这些行为的实例。 9. **并发与分布式(Concurrency and ...

    Erlang中的socket编程简单例子

    gen_tcp模块提供了用于创建TCP连接的接口,它允许我们监听端口、建立连接、发送数据以及接收数据。TCP是一种面向连接的协议,保证了数据传输的可靠性和顺序性,因此,当我们需要一个可靠的通信通道时,通常会使用TCP...

    Erlang中文手册.pdf

    - **2.2 Gen_Server Behaviour**:文档缺失,未提供具体细节。 - **2.3 Gen_Fsm Behaviour**:讲解如何使用有限状态机行为。 - **2.3.1 有限状态机**:Erlang中的Gen_Fsm行为允许实现有限状态机。 - **2.3.2 实例*...

    python实现的RPC例子

    5. **实现客户端**:同样在`gen-py`目录中,创建一个`client.py`文件,实现客户端代码: ```python from thrift.transport import TSocket from thrift.transport import TTransport from thrift.protocol ...

    Erlang中文手册

    - **Gen_Server**: 用于实现通用服务器行为。 - **功能**: - 处理客户端请求。 - 维护内部状态。 - 支持错误处理和重启策略。 **2.3 Gen_Fsm Behaviour** - **2.3.1 有限状态机** - **定义**: 一种数学模型,...

    rebar生成erlang release 并进行热代码升级

    接下来,我们可以添加一个Gen Server到我们的应用中。这可以通过修改`myapp_sup.erl`文件来完成,具体示例如下: ```erlang init([]) -> Server1 = {myapp_server, {myapp_server, start_link, []}, permanent, ...

    SystemTap动态跟踪数据库性能.pptx

    SystemTap是一种强大的Linux动态跟踪工具,它允许用户在不修改内核或应用程序源代码的情况下,对系统进行深入的性能分析和故障排查。该工具在数据库性能监控领域具有广泛的应用,尤其是针对MySQL和Oracle等关键...

    Erlang入门:构建application练习5(监督树)

    2. **模块(`.erl`)**:实际实现功能的代码,可以是普通的函数模块,也可以是行为模块(如gen_server,gen_event等)。 3. **启动脚本(`.boot`)**:指定启动应用时的初始状态,包括启动哪些进程及其顺序。 4. *...

    erlang入门手册

    - **Gen_Server、Gen_Fsm、Gen_Event**: OTP定义了多种通用的服务器行为,它们基于状态机和事件处理原则,允许开发者专注于业务逻辑的实现。 ### 总结 Erlang入门手册深入浅出地介绍了Erlang语言的基本概念,包括...

    JVisualVM简介与内存泄漏实战分析

    一个典型的内存泄漏例子是在程序中持续创建对象并将它们保留在一个集合中,而这些对象永远不会被释放。例如,下面的代码示例展示了如何通过循环创建大量的字节数组,并将它们添加到HashMap中,从而模拟内存泄漏。 `...

    the-little-elixir-otp-guidebook-code:The Little Elixir&OTP Guidebook的代码示例

    - `gen_server`目录下的代码展示了如何使用GenServer行为创建一个有状态的服务,处理客户端的请求和响应。 - `supervisor`和`gen_event`目录则分别演示了如何利用Supervisor监督树来管理和恢复子进程,以及如何使用...

    echo-server-ex:使用Elixir lang的简单exho服务器

    在`echo-server-ex-main`这个文件夹中,应该有一个名为`lib/echo_server.ex`的文件,其中包含了上述的`EchoServer`模块代码。这个模块将包含所有必要的回调函数实现,以及启动和停止服务器的逻辑。 **测试与调试** ...

    Thrift的第一个例子

    Thrift通过定义一种中间表示(IDL,Interface Description Language)来描述服务,然后自动生成相应的客户端和服务器端代码,使得开发者可以方便地构建分布式系统。 在这个“Thrift的第一个例子”中,我们将学习...

    Java Thrift demo例子

    Java Thrift Demo例子详解 Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开源,现由Apache基金会维护。它允许开发者定义服务接口,然后自动生成多种编程语言的代码,使得不同语言之间可以进行高效、...

    ONVIF协议开发例子程序—设备发现C/S

    6. **编译脚本**:`gen.bat` 可能是一个批处理文件,用于编译和链接这些源代码,生成可执行的设备发现客户端和服务器。 总结来说,这个压缩包提供了一个基础的ONVIF设备发现功能的实现,包括客户端用于搜索设备,...

    thrift python example

    安装Thrift的Python绑定后,运行`thrift -gen py example.thrift`,这将生成一个`example_gen`目录,其中包含了Python客户端和服务器端的代码。 在`example_gen/example`模块中,你会找到`ExampleService`的客户端...

Global site tag (gtag.js) - Google Analytics