Router 实现 与集成

yu
image.png

定义路由

package ziface

/**
router接口
路由里的数据都是IRouter
 */
type IRouter interface {
    //在处理conn业务之前hook
    PreHandle(request IRequest)
    //处理业务的主方法
    Handle(request IRequest)
    //在处理conn业务之后hook
    PostHandle(request IRequest)
}
package znet

import "zinx/ziface"


type BaseRouter struct {

}


//这里之所以BaseRequest的方法都为空
//是因为有Router不希望PreHandle\PostHandle
//所以Router全部继承BaseRouter的好处
//在处理conn业务之前hook
func (r *Request) PreHandle(request ziface.IRequest){}

//处理业务的主方法
func (r *Request) Handle(request ziface.IRequest){}

//在处理conn业务之后hook
func (r *Request) PostHandle(request ziface.IRequest){}

犹豫我们之前的Connection是和handleApi绑定的,现在我们要和Router绑定

所以我们的的结构体需要修改

type Connection struct {
    //当前链接Socket TCP
    Conn *net.TCPConn

    //链接的ID
    ConnID uint32

    //当前链接的状态
    isClosed bool

    //退出channel
    ExitChan chan bool

    //该链接处理的Router
    Router ziface.IRouter
}

并且修改StartReade()的方法

/**
    链接的读业务方法
 */
func (c *Connection) StartReader()  {
    fmt.Println("Reader Goroutine is running...")
    defer fmt.Println("c.connID=",c.ConnID," Reader is exit,remote addr is ",c.RemoteAddr().String())
    defer c.Stop()

    for   {
        //读取客户端的数据到buf中,最大512字节
        buf :=make([]byte,512)
        _,err:=c.Conn.Read(buf)
        if err!=nil{
            fmt.Println("recv buf err",err)
            continue
        }

        req := Request{
            conn:c,
            data:buf,
        }

        go func(request ziface.IRequest) {
            //调用router,
            c.Router.PreHandle(request)
            c.Router.Handle(request)
            c.Router.PostHandle(request)
        }(&req)

    }
}

然后需要修改我们的 Start方法中的dealConn

//阻塞的等待客户端的链接,处理业务
        for {
            conn,err := listen.AcceptTCP()
            if err!=nil {
                fmt.Println("Accept err",err)
                continue
            }

            //客户端已经建立链接,做一些业务,因为比较简单,所以就回写吧
            dealConn := NewConnection(conn,cid,this.Router)
            cid++

            //启动当前业务
            go dealConn.Start()

        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容