Request请求消息的封装定义
- 新增IRequest接口
type IRequest interface {
GetConnection() IConnection
GetData() []byte
}
- 新增Request结构体
type Request struct {
Conn ziface.IConnection
Data []byte
}
func (r *Request) GetConnection() ziface.IConnection {
return r.Conn
}
func (r *Request) GetData() []byte {
return r.Data
}
Router模块的定义
- 新增IRouter接口
type IRouter interface {
PreHandle(request IRequest)
Handle(request IRequest)
PostHandle(request IRequest)
}
- 新增Router结构体(用于被其它类继承使用)
type BaseRouter struct {
}
func (b *BaseRouter) PreHandle(request ziface.IRequest) {
}
func (b *BaseRouter) Handle(request ziface.IRequest) {
}
func (b *BaseRouter) PostHandle(request ziface.IRequest) {
}
框架继承Router模块
- 在server中新增
- 新增方法,传入Router
- 将原本写死的回调函数取消,通过Router的抽象类在外部传入
func (s *Server) AddRouter(router ziface.IRouter) {
s.Router = router
}
- 在Connection中修改方法
测试
- 目录结构
- 在新的zinxV0.3中添加新的测试Server和Client(和之前一样不需要改变)
type PingRouter struct {
znet.BaseRouter
}
func (p *PingRouter) PreHandle(request ziface.IRequest) {
fmt.Println("Call PreHandle...")
_, err := request.GetConnection().GetTcpConnection().Write([]byte("before ping..."))
if err != nil {
fmt.Println("PreHandle Error:", err)
}
}
func (p *PingRouter) Handle(request ziface.IRequest) {
fmt.Println("Call Handle...")
_, err := request.GetConnection().GetTcpConnection().Write([]byte("ping...ping...ping..."))
if err != nil {
fmt.Println("Handle Error:", err)
}
}
func (p *PingRouter) PostHandle(request ziface.IRequest) {
fmt.Println("Call PostHandle...")
_, err := request.GetConnection().GetTcpConnection().Write([]byte("after ping..."))
if err != nil {
fmt.Println("PostHandle Error:", err)
}
}
func main() {
s := znet.NewServer("[zinxV0.3]")
s.AddRouter(&PingRouter{})
s.Serve()
}
- 测试完成,但是发现又黏包的现象,需要之后重构