Browse Source

添加多路由配置功能 Zinx-V0.6

master
aceld 6 years ago
parent
commit
92635b4e70
  1. 8
      ziface/imsghandler.go
  2. 2
      ziface/iserver.go
  3. 34
      znet/connection.go
  4. 44
      znet/msghandler.go
  5. 14
      znet/server.go

8
ziface/imsghandler.go

@ -0,0 +1,8 @@
package ziface
/*
消息管理抽象层
*/
type IMsgHandle interface{
DoMsgHandler(request IRequest) //马上以非阻塞方式处理消息
AddRouter(msgId uint32, router IRouter) //为消息添加具体的处理逻辑
}

2
ziface/iserver.go

@ -9,5 +9,5 @@ type IServer interface{
//开启业务服务方法
Serve()
//路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用
AddRouter(router IRouter)
AddRouter(msgId uint32, router IRouter)
}

34
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)
}
}

44
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)
}

14
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)
}
Loading…
Cancel
Save