定义路由
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()
}
网友评论