【zinx】Golang轻量级TCP服务器框架(六)—— 基础msgHandler模块以及多路由模块的实现

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.多路由集成

  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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋山刀名鱼丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值