链接管理模块
属性
Connection链接的集合
针对map的互斥锁
方法
添加链接
//添加链接
func (cm *ConnManager) Add(conn ziface.IConnection) {
//加锁
cm.connLock.Lock()
defer cm.connLock.Unlock()
cm.connections[conn.GetConnID()] = conn
fmt.Println("Add connid = ", conn.GetConnID(), "to manager succ")
}
删除链接
func (cm *ConnManager) Remove(connID uint32) {
//加锁
cm.connLock.Lock()
defer cm.connLock.Unlock()
delete(cm.connections, connID)
fmt.Println("delete connid = ", connID, "from manager succ")
}
根据链接ID得到链接
//根据链接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, errors.New("connection not Found!")
}
}
得到目前服务器的链接总个数
//得到当前服务器链接的总个数
func (cm *ConnManager) Len() uint32 {
return uint32(len(cm.connections))
}
清空全部链接方法
//清空链接
func (cm *ConnManager) ClearConn() {
//加锁
cm.connLock.Lock()
defer cm.connLock.Unlock()
//遍历删除
for connID, conn := range cm.connections {
//将全部的conn 关闭
conn.Stop()
//删除链接
delete(cm.connections, connID)
}
fmt.Println("Clear All Conections succ! conn num = ", cm.Len())
}
将管理模块集成到zinx框架中
- 给connection增加一个属于server的属性
- 将ConnManager加入到server模块
- 每次成功与客户端连接后,判断最大链接数,没达到则将新链接添加到链接管理模块
- 每次与客户端的链接断开后,将链接从链接管理模块中删除
- 服务器停止后,清空全部链接
全局配置
最大链接数量