多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### 9.4 注册链接启动/停止自定义Hook方法功能 有的时候,在创建链接的时候,希望在创建链接之后、和断开链接之前,执行一些用户自定义的业务。那么我们就需要给Zinx增添两个链接创建后和断开前时机的回调函数,一般也称作Hook\(钩子\)函数。 我们可以通过Server来注册conn的hook方法 > zinx/ziface/iserver.go ```go type IServer interface{ //启动服务器方法 Start() //停止服务器方法 Stop() //开启业务服务方法 Serve() //路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用 AddRouter(msgId uint32, router IRouter) //得到链接管理 GetConnMgr() IConnManager //设置该Server的连接创建时Hook函数 SetOnConnStart(func (IConnection)) //设置该Server的连接断开时的Hook函数 SetOnConnStop(func (IConnection)) //调用连接OnConnStart Hook函数 CallOnConnStart(conn IConnection) //调用连接OnConnStop Hook函数 CallOnConnStop(conn IConnection) } ``` > zinx/znet/server.go ```go //iServer 接口实现,定义一个Server服务类 type Server struct { //服务器的名称 Name string //tcp4 or other IPVersion string //服务绑定的IP地址 IP string //服务绑定的端口 Port int //当前Server的消息管理模块,用来绑定MsgId和对应的处理方法 msgHandler ziface.IMsgHandle //当前Server的链接管理器 ConnMgr ziface.IConnManager // ======================= //新增两个hook函数原型 //该Server的连接创建时Hook函数 OnConnStart func(conn ziface.IConnection) //该Server的连接断开时的Hook函数 OnConnStop func(conn ziface.IConnection) // ======================= } ``` 实现添加hook函数的接口和调用hook函数的接口 ```go //设置该Server的连接创建时Hook函数 func (s *Server) SetOnConnStart(hookFunc func (ziface.IConnection)) { s.OnConnStart = hookFunc } //设置该Server的连接断开时的Hook函数 func (s *Server) SetOnConnStop(hookFunc func (ziface.IConnection)) { s.OnConnStop = hookFunc } //调用连接OnConnStart Hook函数 func (s *Server) CallOnConnStart(conn ziface.IConnection) { if s.OnConnStart != nil { fmt.Println("---> CallOnConnStart....") s.OnConnStart(conn) } } //调用连接OnConnStop Hook函数 func (s *Server) CallOnConnStop(conn ziface.IConnection) { if s.OnConnStop != nil { fmt.Println("---> CallOnConnStop....") s.OnConnStop(conn) } } ``` 那么接下来,需要选定两个Hook方法的调用位置。 一个是创建链接之后: > zinx/znet/connection.go ```go //启动连接,让当前连接开始工作 func (c *Connection) Start() { //1 开启用户从客户端读取数据流程的Goroutine go c.StartReader() //2 开启用于写回客户端数据流程的Goroutine go c.StartWriter() //================== //按照用户传递进来的创建连接时需要处理的业务,执行钩子方法 c.TcpServer.CallOnConnStart(c) //================== } ``` 一个是停止链接之前: > zinx/znet/connection.go ```go //停止连接,结束当前连接状态M func (c *Connection) Stop() { fmt.Println("Conn Stop()...ConnID = ", c.ConnID) //如果当前链接已经关闭 if c.isClosed == true { return } c.isClosed = true //================== //如果用户注册了该链接的关闭回调业务,那么在此刻应该显示调用 c.TcpServer.CallOnConnStop(c) //================== // 关闭socket链接 c.Conn.Close() //关闭Writer c.ExitBuffChan <- true //将链接从连接管理器中删除 c.TcpServer.GetConnMgr().Remove(c) //关闭该链接全部管道 close(c.ExitBuffChan) close(c.msgBuffChan) } ```