go-study/zinx/znet/connmanager.go
2025-09-14 18:12:02 +08:00

77 lines
1.8 KiB
Go

package znet
import (
"fmt"
"go-study/zinx/ziface"
"sync"
)
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 (cm *ConnManager) Add(conn ziface.IConnection) {
cm.connLock.Lock()
defer cm.connLock.Unlock()
// 将连接添加到连接集合中
cm.connections[conn.GetConnID()] = conn
fmt.Println("connection add to ConnManager successfully: connID =", conn.GetConnID(), " now conn num =", cm.Len())
}
// Remove 删除连接
func (cm *ConnManager) Remove(conn ziface.IConnection) {
cm.connLock.Lock()
defer cm.connLock.Unlock()
// 删除连接
delete(cm.connections, conn.GetConnID())
fmt.Println("connection remove from ConnManager successfully: connID =", conn.GetConnID(), " now conn num =", cm.Len())
}
// Get 根据连接ID获取连接
func (cm *ConnManager) Get(connID uint32) (ziface.IConnection, error) {
cm.connLock.RLock()
defer cm.connLock.RUnlock()
if conn, ok := cm.connections[connID]; ok {
return conn, nil
} else {
return nil, fmt.Errorf("connection not found: connID = %d", connID)
}
}
// Len 获取当前连接总数
func (cm *ConnManager) Len() int {
return len(cm.connections)
}
// ClearConn 清除并终止所有连接
func (cm *ConnManager) ClearConn() {
cm.connLock.Lock()
defer cm.connLock.Unlock()
// 遍历并停止所有连接
for connID, conn := range cm.connections {
// 停止连接
conn.Stop()
// 删除连接
delete(cm.connections, connID)
}
fmt.Println("Clear all connections successfully: now conn num =", cm.Len())
}