本文公众号链接为:https://mp.weixin.qq.com/s/ClTgY-S7hLfirWo_-SvEIA
Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。
Gate 模块为Leaf提供接入功能。这个模块的功能很重要,是服务器的入口。它能同时监听TcpSocket和WebSocket。主要流程是在接入连接的时候创建一个Agent,并将这个Agent通知给AgentRpc。其核心其实是一个TcpServer和WebScoketServer,他的协议函数能够将socket字节流分包,封装为Msg传递给Agent。其工作流可以查看Server模块。
那么gate,network,skeleton的主要用法关系如下
skeleton的用法已经讲解过了
下面先讲讲gate、network各个模块
tcp msg
github.com/name5566/leaf/network/tcp_msg.go
msg是对数据的封装
MsgParser
len + data模式
lenMsgLen int len的字节长度
minMsgLen uint32 最小msg长度
maxMsgLen uint32 最大msg长度
littleEndian bool 大小端
NewMsgParser
以上是初始化值。
SetMsgLen
以上提供了修改msg len的参数。建议不做修改
SetByteOrder
提供了,设置大小端的接口
Read
函数里面的注释很清晰。
1、read len:根据协议读取len大小的字节
2、parse len:根据大小端不同,解析len
3、check len:检查len大小,是不是在min和max之间
4、data:读取len大小的数据。
Write
函数的注释很清晰
1、get len:获取msg len
2、check len:判断len是否是在min和max之间
3、根据len和data大小,申请msg buf
4、write len:根据大小端不同写入len
5、write data:将data写入到msg buf中
6、最后将msg发送出去
小结:
msg是一个很简单的协议封装,len+data模式。读写函数功能,是标准的写法。
tcp conn
先看下Conn接口
github.com/name5566/leaf/network/conn.go
github.com/name5566/leaf/network/tcp_conn.go
tcp conn是连接的一个封装
这里面用chan来进行写操作的封装
除了write的处理上需要讲解下,read则和常规类似
TCPConn
其中最重要的是writeChan,msgParser
newTCPConn
1、初始化。其中注意下writechan中的pendingWriteNum,chan的容量
2、开启了一个协程,用于写。 这里的协程是重点
从writechan中,不停的接收数据,然后将其发送出去。
当writechan close后,则退出。
Write
tcp msg中,已经分析过了,msgparser的write将信息按照协议封装后,则会调用conn的write
这里调用了doWrite
这里面,将要发送的数据,发送到writechan中
Read
msgparser的Read需要调用conn的Read
close
略
tcp server
github.com/name5566/leaf/network/tcp_server.go
tcp server
以上结构中,重要的东西
1、Agent:agent是封装conn和processor的角色。后面会重点讲
2、msg parser:这个已经讲解过了。
其余的都是常规的用法
Start
启动接口,init和run
init
主要工作
1、创建tcp监听
2、初始化msg parser
run
1、accept连接
2、连接判断是否超过上限。
3、将conn放入conns中,用于后期close的处理
4、重点,将conn和msgparser封装到tcpconn中
5、将tcpconn生成agent
6、agent run。重点是在agent中处理的。这里要记住
processor
github.com/name5566/leaf/network/processor.go
processor是逻辑处理的重要环节
processor中主要的目的就是路由和序列化和反序列化处理
这里用json来讲解
github.com/name5566/leaf/network/json/json.go
processor
processor中保存了一系列的msginfo
MsgInfo
其中最重要的是msgRouter。
msgHandler和msgRawHandler基本上不推荐使用。但也是给使用者留有更灵活的处理模式。
Register
注册msg类型,这里代码很清晰
SetRouter
1、先查找到对应的msg,这个需要先注册,否则是非法的。
2、对应的路由设置。其实就是设置chanrpc。
chanrpc的用法,已经讲解过了。
route
1、raw信息的处理。这里面需要先SetRawHandler。但不推荐这种用法。
一般情况下raw是没有设置的
2、然后查找msg类型
3、msghandler处理。这里面需要先设置SetHandler。但也不推荐这种用法。
一般情况下handler是没有设置的
4、最后,会执行chanrpc中的Go。这里是连接chanrpc的部分
unmarshal marshal
略
gate
github.com/name5566/leaf/gate/gate.go
gate虽然非常重要,但其代码确很少。主要是一个组织角色
Gate
里面很重要的部分,processor讲解过了,chanrpc也讲解过了,network也讲解过了。看看这些是怎么组织起来的
Run
其中代码省略了wsServer代码。
其中最重要的部分是,向tcpserver提供了一个NewAgent函数。
随后就是tcpserver start。
agent
github.com/name5566/leaf/gate/agent.go
agent接口
github.com/name5566/leaf/gate/gate.go
agent里面包含了conn和gate信息
最主要的流程在这里
1、agent中,封装的conn,也就是tcp conn,来ReadMsg。
ReadMsg会通过tcp msg来读取信息。
2、processor来进行反序列化
3、processor来进行路由处理,其实是chanrpc中的Go,将要处理的方法,参数,发送给了chanrpc。
总结
gate中,各个模块的职责都很清晰,一个模块只做自己的工作。要了解其过程,就需要先了解各个模块的职责。然后将其串起来。
龚浩华
月牙寂道长
QQ 29185807
2018年04月19日
如果你觉得本文对你有帮助,可以转发分享到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注
最后感谢关注本人公众号。
如果想查看历史文章,可以点击公众号下方的按钮“历史文章”
或者点击公众号下方按钮“文章目录”获取所有文章的索引文件