Golang轻量级TCP服务器框架(六)—— 基础request封装以及router模块绑定
原作者视频地址:zinx-Golang轻量级TCP服务器框架
本人为自学整理的文档,梳理思考开发框架的基本思路,方法,以及视频中不理解的地方。
若想学习,强烈建议直接观看原作视频即可。
可在下方留言交流。
1.目的
什么是路由方法?
其实路由这个词语比较唬人,说白就是,用户在建立server服务器的时候,可以通过我们的zinx框架去自定义方法,当客户端发送过来消息之后,可以执行相应的方法或者功能。
为什么要实现多路由模式?
之前的时候就是一个server绑定一个的路由方法,这样的话功能会比较单一。比如,我们的客户端属性不同,有的客户端是Vip,有的是穷逼Vip,那肯定要区别对待一下。再或者就是客户端发送过来的命令不同,就去执行相应的路由方法。
2.思路
既然是处理消息,让其去执行对应的方法,那么我们就需要一个msgHandler的模块,去存储命令对应的路由方法。
既然用户可以定义方法,那么肯定是通过server结构体注册的方法,那么我们需要在server结构体中添加msgHandler模块。
type server struct {
//服务器的名称
name string
//ip的版本
ipVersion string
//ip地址
ip string
//ip监听端口
port int
//路由
msgHandler ziface.IMsgHandler
}
但是,当connection获取到消息,再去执行的时候,肯定不能再去调用server中绑定的msghandler,所以我们还需要再connection中建立一个msghandler模块,因为server中的方法可能很多,客户端链接,只需要知道自己对应的路由方法即可。
type connection struct {
//当前链接的socket TCP套接字
conn *net.TCPConn
//当前链接ID
connID uint32
//当前链接是否关闭
isClosed bool
//通知当前链接已经退出/停止的channel
exitChan chan bool
//路由
msgHandler ziface.IMsgHandler
}
3.imsgHandler接口的实现
type IMsgHandler interface {
//执行对应的Router处理方法
DoMsgHandler(request IRequest)
//为消息添加路由
AddRouter(msgComm uint8, router IRouter)
}
4.msgHandler的具体实现
type msgHandler struct {
//消息命令对应的路由方法
Apis map[uint8]ziface.IRouter
}
func NewMsgHandler() *msgHandler {
return &msgHandler{
Apis: make(map[uint8]ziface.IRouter),
}
}
//执行对应的Router处理方法
func (mh *msgHandler) DoMsgHandler(request ziface.IRequest) {
router, ok := mh.Apis[request.GetMsg().GetMsgComm()]
if !ok {
panic("register is nothing")
}
router.PreHandle(request)
router.Handle(request)
router.PostHandle(request)
}
//为消息添加路由
func (mh *msgHandler) AddRouter(msgComm uint8, router ziface.IRouter) {
if _, ok := mh.Apis[msgComm] ; ok{
panic("register is re")
}
mh.Apis[msgComm] = router
}
5.多路由集成
- 将路由方法注册到server结构体
s.AddRouter(0,&PingRouter{})
s.AddRouter(1,&TestRouter{})
func (s *server) AddRouter(comm uint8, router ziface.IRouter) {
s.msgHandler.AddRouter(comm, router)
}
- 将server中的msgHandler绑定到connection
//3.阻塞的等待客户端连接,处理客户端业务
for {
conn, err := listenner.AcceptTCP()
if err != nil {
fmt.Println("[ERROR] Accept client conn is error :", err)
continue
}
//这里其实可以,给不同的客户端绑定不同的方法
dealConn := NewConnection(conn, cid, s.msgHandler)
cid++
go dealConn.Start()
}
- 修改conn中的StartReader()
//执行注册的路由方法
go func(request ziface.IRequest) {
//这里直接替换到原来的单一路由即可
c.msgHandler.DoMsgHandler(request)
}(&req)