zinx/znet/connManager.go

88 lines
2.0 KiB
Go

package znet
import (
"errors"
"fmt"
"sync"
"zinx/ziface"
)
/*
连接管理模块
*/
type ConnManager struct {
//管理的连接集合
connections map[uint32]ziface.IConnection
//保护连接集合的读写锁
connLock sync.RWMutex
}
// NewConnManager 创建当前连接的方法
func NewConnManager() *ConnManager {
return &ConnManager{
connections: make(map[uint32]ziface.IConnection),
}
}
// Add 添加连接
func (connMgr *ConnManager) Add(conn ziface.IConnection) {
//保护共享资源map ,加写锁
connMgr.connLock.Lock()
defer connMgr.connLock.Unlock()
//将conn 加入到connmanager 中
connMgr.connections[conn.GetConnectionID()] = conn
fmt.Println("connID = ", conn.GetConnectionID(), "add connection add to connmanager successfully : conn num = ", connMgr.Len())
}
// Remove 删除连接
func (connMgr *ConnManager) Remove(conn ziface.IConnection) {
//保护共享资源map ,加写锁
connMgr.connLock.Lock()
defer connMgr.connLock.Unlock()
//删除链接
delete(connMgr.connections, conn.GetConnectionID())
fmt.Println("connID = ", conn.GetConnectionID(), "delete connection from connmanager successfully : conn num = ", connMgr.Len())
}
// 根据connID 获取连接
func (connMgr *ConnManager) Get(connID uint32) (ziface.IConnection, error) {
//保护共享资源map ,加写锁
connMgr.connLock.RLock()
defer connMgr.connLock.RUnlock()
if conn, ok := connMgr.connections[connID]; ok {
//找到了
return conn, nil
} else {
return nil, errors.New("connection is not found ")
}
}
// 得到当前的连接总数
func (connMgr *ConnManager) Len() int {
return len(connMgr.connections)
}
// 清楚或终止所有连接
func (connMgr *ConnManager) ClearConn() {
//保护共享资源map ,加写锁
connMgr.connLock.Lock()
defer connMgr.connLock.Unlock()
//删除conn 饼停止conn 的工作
for connID, conn := range connMgr.connections {
//停止
conn.Stop()
//删除
delete(connMgr.connections, connID)
}
fmt.Println("clear all connection successfully ! conn num = ", connMgr.Len())
}