Zinx-V0.3框架基础路由模块
1.IRequest
把客户端请求的连接信息 和 请求的数据,放在一个叫Request的请求类里,这样的好处是我们可以从Request里得到全部客户端的请求信息,也为我们之后拓展框架有一定的作用,一旦客户端有额外的含义的数据信息,都可以放在这个Request里
1.1.ziface
type IRequest interface {
//得到当前的请求的链接
GetConnection() IConnection
//得到链接的数据
GetData() []byte
//得到链接的长度
GetDataLen() int
}
1.2.znet
type Request struct {
//链接信息
conn ziface.IConnection
//数据内容
data []byte
//数据长度
len int
}
func NewReqeust(conn ziface.IConnection, data []byte, len int) ziface.IRequest {
req := &Request{
conn:conn,
data:data,
len:len,
}
return req
}
//得到当前的请求的链接
func(r *Request) GetConnection() ziface.IConnection {
return r.conn
}
//得到链接的数据
func(r *Request) GetData() []byte {
return r.data
}
//得到链接的长度
func(r *Request) GetDataLen() int {
return r.len
}
相当于是把一个链接的一个信息进行了一个封装,下边的路由函数就是去处理这个封装,在读到一个buf后就能生成一个request req := NewReqeust(connection, buf, cnt)
2.Router
2.1.ziface
创建抽象层
type IRouter interface {
//处理业务之前的方法
PreHandle(request IRequest)
//真正处理业务的方法
Handle(request IRequest)
//处理业务之后的方法
PostHandle(request IRequest)
}
2.2.实现层
type BaseRouter struct {}
func (br *BaseRouter)PreHandle(req ziface.IRequest){}
func (br *BaseRouter)Handle(req ziface.IRequest){}
func (br *BaseRouter)PostHandle(req ziface.IRequest){}
实现router时,先嵌入这个基类,然后根据需要对这个基类的方法进行重写。这里之所以BaseRouter的方法都为空,是因为有的Router不希望有PreHandle或PostHandle所以Router全部继承BaseRouter的好处是,不需要实现PreHandle和PostHandle也可以实例化
2.3.IServer中添加添加路由功能
type IServer interface{
......
//路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用
AddRouter(router IRouter)
}
2.4.Server类中添加Router成员
type Server struct {
......
Router ziface.IRouter
}
NewServer中也要对应更改,添加路由信息
2.5.Connection类绑定一个Router成员
在Connection的Start中不再用回调函数处理Request,而是改用Router处理
在生成IConnection时,不再传回调函数,而是传Irouter
2.6在服务端自定义一个路由来处理Request
type PingRouter struct {
znet.BaseRouter //一定要先基础BaseRouter
}
//Test PreHandle
func (this *PingRouter) PreHandle(request ziface.IRequest) {
。。。。。
}
//Test Handle
func (this *PingRouter) Handle(request ziface.IRequest) {
。。。。。
}
//Test PostHandle
func (this *PingRouter) PostHandle(request ziface.IRequest) {
。。。。。
}
func main(){
//创建一个server句柄
s := znet.NewServer("[zinx V0.3]")
s.AddRouter(&PingRouter{})
//2 开启服务
s.Serve()
}
总的来说,Server实现了基础的连接。Connection是把一个链接进行封装,包括连接本身、编号、处理链接内容的路由函数等。Request把一个链接和一条消息进行了封装。Router是给用户预留的一个接口,让用户自己定义用来处理链接的方法。