这个例子是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])).对应关系如下:
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这个函数)
返回信息的格式如下:
| {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 以上内容也许分析有误 欢迎指正.
相关推荐
gen_lex_hash for pc,mysql交叉编译需要用到的文件,5.1.51 and 5.1.63两个版本,5.1.67版本始终编译不出来。有需要的下载。
Gen_Signature_Android2.apk、获取签名工具。
通用 TCP 服务器 通用 TCP 服务器( gen_tcp_server ) 是一种 Erlang 行为,提供快速简便的方法将 TCP 服务器功能添加到您的应用程序。 它被实现为管理 TCP 连接的主管,因为它是孩子。如何使用它? 运行make来构建。...
NULL 博文链接:https://lzy.iteye.com/blog/324962
Gen_Signature_Android.apk
关于在 Erlang 风格的 gen_server 上进行 Ocaml/Async 尝试。
个人学习Erlang的时候自己写的一个基于gen_tcp的聊天室,功能有注册,登陆,获得登陆时间,聊天次数,上次登陆时间等等,资源里有完整代码,注释也很详细.
包名签名查看,输入包名则可查看签名值,用于微信第三方分享 登录等设置填写,安装则可以使用,没需要任何设置,可以在安卓模拟器上使用
华硕Z87-C主板升级BIOS的工具,BIOS_updater_for_4th_Gen_Intel_Core_CPU.zip
srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SR
gen_lyricist.dll 万能播放器仿千千静听
官方例子,深度学习专用,机器学习专用,代码简单,一看就会(dlcv gen label demo)
1、将2560及ramps1.4集合在一块板子上,解决了Ramps1.4组合接口繁琐,易出故障的问题。 2、可更换电机驱动,支持4988驱动和8825驱动。 3、电路板采用高质量的4层板,并专门作了散热优化处理;...
采用verilog实现RTLAB多路驱动程序
pwm_gen,PWN波形发生器,开关波形
erlang-gen_tcp手册,详细完整,网络tcp开发好东东