leaf源码分析(三)----gate和network

本文公众号链接为: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的用法已经讲解过了

leaf源码分析(一)----chanrpc

leaf源码分析(二)----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日

如果你觉得本文对你有帮助,可以转发分享到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注


最后感谢关注本人公众号。
如果想查看历史文章,可以点击公众号下方的按钮“历史文章”
或者点击公众号下方按钮“文章目录”获取所有文章的索引文件


猜你喜欢

转载自blog.csdn.net/screscent/article/details/80005007
今日推荐