原作者视频地址: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.多路由集成
  1. 将路由方法注册到server结构体
	s.AddRouter(0,&PingRouter{})
	s.AddRouter(1,&TestRouter{})
func (s *server) AddRouter(comm uint8, router ziface.IRouter) {
	s.msgHandler.AddRouter(comm, router)
}
  1. 将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()

		}
  1. 修改conn中的StartReader()
		//执行注册的路由方法
		go func(request ziface.IRequest) {
	//这里直接替换到原来的单一路由即可
			c.msgHandler.DoMsgHandler(request)
		}(&req)