diff --git a/ziface/imsghandler.go b/ziface/imsghandler.go new file mode 100644 index 0000000..36d8f9d --- /dev/null +++ b/ziface/imsghandler.go @@ -0,0 +1,8 @@ +package ziface +/* + 消息管理抽象层 + */ +type IMsgHandle interface{ + DoMsgHandler(request IRequest) //马上以非阻塞方式处理消息 + AddRouter(msgId uint32, router IRouter) //为消息添加具体的处理逻辑 +} \ No newline at end of file diff --git a/ziface/iserver.go b/ziface/iserver.go index 4ac018d..4765140 100644 --- a/ziface/iserver.go +++ b/ziface/iserver.go @@ -9,5 +9,5 @@ type IServer interface{ //开启业务服务方法 Serve() //路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用 - AddRouter(router IRouter) + AddRouter(msgId uint32, router IRouter) } \ No newline at end of file diff --git a/znet/connection.go b/znet/connection.go index 5292581..115c665 100644 --- a/znet/connection.go +++ b/znet/connection.go @@ -15,13 +15,10 @@ type Connection struct { ConnID uint32 //当前连接的关闭状态 isClosed bool - - //该连接的处理方法router - Router ziface.IRouter - + //消息管理MsgId和对应处理方法的消息管理模块 + MsgHandler ziface.IMsgHandle //告知该链接已经退出/停止的channel ExitBuffChan chan bool - //给缓冲队列发送数据的channel, // 如果向缓冲队列发送数据,那么把数据发送到这个channel下 // SendBuffChan chan []byte @@ -30,12 +27,12 @@ type Connection struct { //创建连接的方法 -func NewConntion(conn *net.TCPConn, connID uint32, router ziface.IRouter) *Connection{ +func NewConntion(conn *net.TCPConn, connID uint32, msgHandler ziface.IMsgHandle) *Connection{ c := &Connection{ Conn: conn, ConnID: connID, isClosed: false, - Router: router, + MsgHandler: msgHandler, ExitBuffChan: make(chan bool, 1), // SendBuffChan: make(chan []byte, 512), } @@ -49,14 +46,6 @@ func (c *Connection) StartReader() { defer c.Stop() for { - //读取我们最大的数据到buf中 - //buf := make([]byte, utils.GlobalObject.MaxPacketSize) - //_, err := c.Conn.Read(buf) - //if err != nil { - // fmt.Println("recv buf err ", err) - // c.ExitBuffChan <- true - // continue - //} // 创建拆包解包的对象 dp := NewDataPack() @@ -93,19 +82,8 @@ func (c *Connection) StartReader() { conn:c, msg:msg, } - //从路由Routers 中找到注册绑定Conn的对应Handle - go func (request ziface.IRequest) { - //执行注册的路由方法 - c.Router.PreHandle(request) - c.Router.Handle(request) - c.Router.PostHandle(request) - }(&req) - - //if err := c.handleAPI(c.Conn, buf, cnt); err !=nil { - // fmt.Println("connID ", c.ConnID, " handle is error") - // c.ExitBuffChan <- true - // return - //} + //从绑定好的消息和对应的处理方法中执行对应的Handle方法 + go c.MsgHandler.DoMsgHandler(&req) } } diff --git a/znet/msghandler.go b/znet/msghandler.go new file mode 100644 index 0000000..8fdf966 --- /dev/null +++ b/znet/msghandler.go @@ -0,0 +1,44 @@ +package znet + +import ( + "fmt" + "strconv" + "zinx/ziface" +) + +type MsgHandle struct{ + Apis map[uint32] ziface.IRouter //存放每个MsgId 所对应的处理方法的map属性 +} + +func NewMsgHandle() *MsgHandle { + return &MsgHandle { + Apis:make(map[uint32]ziface.IRouter), + } +} + +//马上以非阻塞方式处理消息 +func (mh *MsgHandle) DoMsgHandler(request ziface.IRequest) { + handler, ok := mh.Apis[request.GetMsgID()] + if !ok { + fmt.Println("api msgId = ", request.GetMsgID(), " is not FOUND!") + return + } + + //执行对应处理方法 + handler.PreHandle(request) + handler.Handle(request) + handler.PostHandle(request) +} +//为消息添加具体的处理逻辑 +func (mh *MsgHandle) AddRouter(msgId uint32, router ziface.IRouter) { + //1 判断当前msg绑定的API处理方法是否已经存在 + if _, ok := mh.Apis[msgId]; ok { + panic("repeated api , msgId = " + strconv.Itoa(int(msgId))) + } + //2 添加msg与api的绑定关系 + mh.Apis[msgId] = router + fmt.Println("Add api msgId = ", msgId) +} + + + diff --git a/znet/server.go b/znet/server.go index 71aec7c..f7f649e 100644 --- a/znet/server.go +++ b/znet/server.go @@ -18,8 +18,8 @@ type Server struct { IP string //服务绑定的端口 Port int - //当前Server由用户绑定的回调router,也就是Server注册的链接对应的处理业务 - Router ziface.IRouter + //当前Server的消息管理模块,用来绑定MsgId和对应的处理方法 + msgHandler ziface.IMsgHandle } /* @@ -33,7 +33,7 @@ func NewServer () ziface.IServer { IPVersion:"tcp4", IP:utils.GlobalObject.Host, Port:utils.GlobalObject.TcpPort, - Router: nil, + msgHandler: NewMsgHandle(), } return s } @@ -82,7 +82,7 @@ func (s *Server) Start() { //3.2 TODO Server.Start() 设置服务器最大连接控制,如果超过最大连接,那么则关闭此新的连接 //3.3 处理该新连接请求的 业务 方法, 此时应该有 handler 和 conn是绑定的 - dealConn := NewConntion(conn, cid, s.Router) + dealConn := NewConntion(conn, cid, s.msgHandler) cid ++ //3.4 启动当前链接的处理业务 @@ -109,10 +109,8 @@ func (s *Server) Serve() { } //路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用 -func (s *Server)AddRouter(router ziface.IRouter) { - s.Router = router - - fmt.Println("Add Router succ! " ) +func (s *Server)AddRouter(msgId uint32, router ziface.IRouter) { + s.msgHandler.AddRouter(msgId, router) }