erlang游戏源码--英雄远征分析



erl +P 1024000 +K true -smp disable -name sd2@127.0.0.1 -setcookie sd2 -mnesia extra_db_nodes ["'sd1@127.0.0.1'"] -boot start_sasl -config log  -s sd gateway_start -extra 127.0.0.1 5566 0


+P 1024000 erlang节点系统的最大并发进程数;
+K true | false 是否开启kernel poll,就是epoll;
-smp disable SMP 多处理器
-name -name Name 给一个erlang节点/进程设置一个名称
-setcookie Cookie 给节点设置cookie
-mnesia extra_db_nodes  当无盘节点需要从网络上的一个远程节点找到schema定义,则我们需要从-mnesia extra_db_nodes
-boot File   指定启动使用的boot文件,默认是$ROOT/bin/start.boot,在这个目录下还有start_clean.boot,start_sasl.boot。如果需要sasl的话,就“-boot start_sasl ”;
-extra 参数
-s Mod [Func [Arg1, Arg2, ...]]
-config Config 指定配置文件,这个是很有用的


调试宏
 -ifdef(debug).-define(LOG(Msg,List), io:format(Msg,List)).-else.-define(LOG(Msg,List), ok).-endif. 


启动:
1.script/
gateway.sh -->sd.erl -->gateway.app
-->sd_gateway_app.erl 
%% 启动数据库mysql
%% 启动超级监听sd_gateway_sup
-->sd_gateway_sup.erl
-->sd_gateway.erl
stop: %% 组合主进程的名字 %% 找到这个进程  %% 杀死这个进程
start_raw_server:%% 组合进程名字 %% 查找是不已经存在  %% 创建一个进程负责监听gen_tcp:listen
,mod_disperse.erl
-->sd_gateway_server.erl
start_raw_server开启TCP_SERVER
1.开启一个进程负责code_start-》gen_tcp:listen成功就发送一个消息回到父进程注册进程名字,再开启一个等待连接进程
2.如果gen_tcp:accept成功连接上就发送给父类一个消息istarted再开启另外一个


mod_disperse 线路分布
1.net_kernel调用这个方法来订阅节点状态变动的消息,分布式节点
2.ets 保存服务器节点 
3.节点之间互相通知


run.sh
sd.erl -->server_start-->server.app-->sd_server_app.erl
-->sd_sup.erl,sd_networking.erl
sd_sup 
1.监控树
sd_networking
start:启动需要的一些子监听
mod_kernel
1.初始化ets表缓存
2.%% mysql数据库连接初始化
3.初始化表数据,就是需要读取的数据到ets表


start_disperse 线路分布,集群
1.net_kernel:monitor_nodes 节点订阅
2.建立ets 表保存server路线 集群信息,以后和其它线路有关的广播都经过它传递
3.加入到集群写到数据库,遍历ping同所有节点,通知其它节点它的加入和信息   不解:数据库开始怎么存在Nodes,后面无法ping???


mod_rand随机种子
sd_tcp_client_sup客户端监控树  
-->sd_reader
1.启动一个普通进程 login_parse_packet解析登陆


用来监控每个connection的处理进程


sd_tcp_listener_sup 监听树
-->sd_tcp_acceptor_sup 等待连接监听
sd_tcp_acceptor


sd_tcp_listener
tcp_listener里启动tcp服务器,监听端口,并且通过 tcp_acceptor_sup启动N个tcp_accetpor



 TCP层:
  server.app通过application:start()-->sd_server_app启动sd_sup顶级监听,sd_networking启动各种子监听(注意只是启动子监听不是启动子监听里面的监听或者工作者)-->sd_tcp_client_sup,sd_tcp_listent_sup-->sd_tcp_listener_sup启动sd_tcp_accepte_sup监听,和sd_tcp_listener它里面启动网络监听Listener成功之后启动10个accepte等待连接,主要有一个连接上了就绑定socket启动一个sd_tcp_client_sup的子工作者sd_reader接受消息,同时再启动一个accetp等待连接。采用的是异步和广播。


 sd_read.erl-->
  1.做个沙河验证
  2.登陆处理使用异步接受格式Len+Cmd+data,len是16位比特位就是两个字节,Cmd同样,所以头就是4个字节。验证头后就取得后面的数据data,先通过routing把数据解析处理    [H1, H2, _, _, _] = integer_to_list(Cmd),
    Module = list_to_atom("pt_"++[H1,H2]),([]本身就是list)
    3.%%先验证登陆在里面加入MD5验证码,同时使用Client的record记录下登陆情况再放回等待数据
    4. %%读取玩家列表
    5. %%创建角色
    6.%%删除角色
    7.%%进入游戏-->do_parse_packet 处理以后的逻辑
mod_login:login(start, [Id, Client#client.accname], Socket)
先检查是否在线(不明白它的检查)-->检查通过写入登陆时间--->登陆成功
-->分别启动各种模块并且初始化他们,再初始化mod_player,写入ets缓存状态,上线之后的一些处理例如:通知好友等
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值