您的位置:首页 > 其它

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

2015-10-30 15:44 405 查看
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缓存状态,上线之后的一些处理例如:通知好友等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: