github.com/binbinly/pkg@v0.0.11-0.20240321014439-f4fbf666eb0f/transport/ws/manager.go (about) 1 package ws 2 3 import ( 4 "sync" 5 ) 6 7 // Manager 连接管理模块 8 type Manager struct { 9 mu sync.RWMutex 10 11 connections map[uint64]Connection 12 } 13 14 // NewManager 创建一个链接管理器 15 func NewManager() *Manager { 16 return &Manager{ 17 connections: make(map[uint64]Connection), 18 } 19 } 20 21 // Add 添加连接 22 func (c *Manager) Add(conn Connection) { 23 c.mu.Lock() 24 defer c.mu.Unlock() 25 26 c.connections[conn.GetID()] = conn 27 } 28 29 // Remove 删除连接 30 func (c *Manager) Remove(conn Connection) { 31 c.mu.Lock() 32 defer c.mu.Unlock() 33 34 delete(c.connections, conn.GetID()) 35 } 36 37 // Get 获取连接 38 func (c *Manager) Get(cid uint64) (Connection, error) { 39 c.mu.RLock() 40 defer c.mu.RUnlock() 41 42 if conn, ok := c.connections[cid]; ok { 43 return conn, nil 44 } 45 return nil, ErrConnNotFound 46 } 47 48 // Len 获取连接数 49 func (c *Manager) Len() int { 50 return len(c.connections) 51 } 52 53 // Clear 清除并停止所有连接 54 func (c *Manager) Clear() { 55 // 这里不需要单独调用删除连接,也不可以加锁,conn.Stop()里处理了,否则会死锁 56 for _, conn := range c.connections { 57 conn.Stop() 58 } 59 } 60 61 // Range 遍历所有连接 62 func (c *Manager) Range(f ConnHandlerFunc) (err error) { 63 for cid, conn := range c.connections { 64 err = f(cid, conn) 65 } 66 67 return err 68 }