使用GoLang开发游戏服务器(三)

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()
}
  • 测试完成,但是发现又黏包的现象,需要之后重构