美文网首页
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