博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leaf源码分析(三)----gate和network
阅读量:4031 次
发布时间:2019-05-24

本文共 3154 字,大约阅读时间需要 10 分钟。

本文公众号链接为:

 

 

 

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日

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

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

最后感谢关注本人公众号。

如果想查看历史文章,可以点击公众号下方的按钮“历史文章”
或者点击公众号下方按钮“文章目录”获取所有文章的索引文件

 

你可能感兴趣的文章
[茶余饭后]10大毕业生必听得歌曲
查看>>
gdb调试命令的三种调试方式和简单命令介绍
查看>>
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>
Xpath使用方法
查看>>
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>