霸哥的话:小型的项目,你都搞明白了,就很猛了!
启动过程:
make run1
run1在MakeFile中的定义:
janus.erl内容:
调用了application:start/1 方法,这样会启动一个erlang 应用,应用程序的定义在同名的janus.app中:
直接看janus.app中最后的回调模块部分:
系统会调用janus_app:start/2
所以查看janus_app.erl中的代码:
获取了服务器端监听的端口,然后启动了一个Supervisor,传入的参数为[ Port,transport ]
所以看init/2 这个初始化方法:
启动了一系列子进程,先看第一个:
看这个启动方法:
调用了acceptor_init/3 函数:
在do_init/1 中监听了端口,监听成功后再调用acceptor_loop/1 循环处理接入的客户端请求:
一旦有新的请求来到,则调用handle_connection 进行处理。
janus_app:start_transport/1的定义:
这里的janus_transport_sup是主进程监控树下的一个子进程,而这个进程也是个监督树。start_child会在这个监督树下添加子进程。
----------------------------------------------------------------------------------------------暂停---------------------------------------------------------------------------------------------------------------
再来看janus_app.erl中定义的ID 为janus_transport_sup 这个子进程(类型为监督树)。
supervisor:start_link/3 ,再看传入的参数: [{local,janus_transport_sup},?MODULE,[Module]] ,第二个参数值为janus_app模块本身,第三个参数的值为transport
所以就是再次以自己为模板使用transport为参数来初始化一个监控树,调用的为init/1:
以上为这个supervisor的子进程的定义:一个transport的gen_server子进程。这个子进程的启动方法为start_link,
---------------------------------------------------------------------------------------继续---------------------------------------------------------------------------------------------------------------------
目前的监控树结构如下:
刚才janus_sup 监听到了客户端的链接,并调用了janus_transport_sup:start_child/1
下面建立一个子进程,这个子进程启动时调用的是transport:start_link。所以服务器每接收到一个client 的连接请求就会在janus_transport_sup下添加相应的子进程。
再回到janus_acceptor:handle_connection/2,我们一但在janus_transport_sup下启动了子进程就会返回相应的PID。
然后调用gen_tcp:controlling_process/2 将这个客户端相应的socket 指定地绑定到此PID上:
下一句:
发送了一个异步的请求给刚才生成的进程,由transport:handle_cast 处理:
这里需要注意(State#state.transport)这个record中的transport 值是在建立子进程时定义的:
所以(State#state.transport):start(Socket) 调用的是janus_flash:start/1:
这里调用client_proxy:start将 gen_tcp:send 函数包装成了一个gen_server 所以每一个transport 就附带了一个专门用来发送数据的gen_server。
在keep_alive_or_close里判断了当前连接是否需要关闭后整个客户端连接的初始化算是完成了。
TOPIC发布消息的处理:
每个socket 客户端连接都经过 gen_tcp:controlling_process 被绑定到一个gen_server 类型的进程:transport 。
所有发送到socket 的消息都由 transport:handle_info处理(验证
)。
以上代码中的Mod为janus_flash,所以具体的消息处理由janus_flash:process处理。
将客户端发送过来的二进制数据解析为一个JSON 记录,然后交由topman:publish/2 来处理。
gen_server:abcast/2 会向本地指定的gen_server 发送一个请求,由相应gen_server 的handle_cast/2 函数进行处理。(gen_server:cast 和 gen_server:abcast区别
)
这里先判断相应TOPIC的服务是否存在,不存在则新建一个。
分享到:
相关推荐
单人+电脑对手,难度各异,使用OpenGL和IrrLicht图形引擎进行简单的飙车游戏,从各种汽车中选择,每种汽车都有自己的视觉设置并在高速公路上比赛,每个晚上只有20秒! !
风火轮风火轮的后端用户模型ID 创建于更新于电子邮件密码角色(客户|所有者|交付)用户CRUD 创建帐号登录查看个人资料编辑个人资料验证邮件餐厅模型名称类别地址封面图片编辑餐厅删除餐厅查看分类查看餐厅类别(分页...
一个基于Arduino和基于蓝牙的Hot Wheels终点线计时器,用于记录汽车的速度并确定每种热量的获胜者。
一个基于Arduino和基于蓝牙的Hot Wheels终点线计时器,用于记录汽车的速度并确定每种热量的获胜者。
Hashed and Hierarchical Timing Wheels: Data Structures for the Efficient Implementation of a Timer Facility
FOX Wheels Car Affordability
Windows下适用于python 3.5的编译好的Wheels,包括32位和64位。
German Language - THERMOPLASTIC GEAR WHEELS - CYLINDRICALGEARS - CALCULATION 行业标准
wheels-in-tagil
<LabVIEW入门与实战开发100例>--->22Ch Train Wheels Monitor
Force feedback support for Logitech Gaming Wheels.
“Wheels vs. tracks” – A fundamental evaluation from the traction perspective
经典的时间轮算法论文,时间轮的思想应用范围非常广泛,各种操作系统的定时任务调度,Crontab,还有基于java的通信框架Netty中也有时间轮的实现,几乎所有的时间任务调度系统采用的都是时间轮的思想。...
英语Wheels北师大必修PPT课件.pptx
Food-Wheels-Mobile-源码.rar
资源分类:Python库 所属语言:Python 资源全名:build_install_wheels-0.2.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Groovy Recipes Greasing the Wheels of Java.pdf
ESP idf-python-wheels IDF工具要求的Windows Python Wheel的构建。 构建包含分支所需的所有轮子: 版本/v4.2 版本/v4.1.1 掌握 用法 .\Build-Wheels.ps1 -Branch "master" -CompileWheels @("greenlet", ...