美文网首页
Router 实现 与集成

Router 实现 与集成

作者: 茶艺瑶 | 来源:发表于2020-04-27 17:31 被阅读0次
    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()
    
            }
    

    相关文章

      网友评论

          本文标题:Router 实现 与集成

          本文链接:https://www.haomeiwen.com/subject/zaluwhtx.html