-
Notifications
You must be signed in to change notification settings - Fork 6
/
binder.go
92 lines (68 loc) · 1.69 KB
/
binder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package gws
import (
"errors"
"fmt"
"sync"
)
// binder 为 生成与解绑 id 与 conn 之间关系 的结构体
type binder struct {
mu sync.RWMutex
// userID 跟 连接的 map
userID2ConnMap map[int]*Conn
}
// Bind 绑定 userID 跟 对应的连接
func (b *binder) Bind(userID int, conn *Conn) error {
if conn == nil {
return errors.New("绑定失败:连接不能为空")
}
b.mu.Lock()
defer b.mu.Unlock()
if _, ok := b.userID2ConnMap[userID]; ok {
// 该userID 对应的连接已存在
return errors.New(fmt.Sprintf("绑定失败:该 userID %d 对应的连接已存在", userID))
} else {
b.userID2ConnMap[userID] = conn
}
return nil
}
// Unbind 解绑 userID 跟 对应的连接
func (b *binder) Unbind(conn *Conn) error {
if conn == nil {
return errors.New("连接不能为空")
}
b.mu.Lock()
defer b.mu.Unlock()
for userID, c := range b.userID2ConnMap {
if c == conn {
delete(b.userID2ConnMap, userID)
return nil
}
}
return fmt.Errorf("该连接不在连接 map 中")
}
// FindByID 从 map 中 找到对应的连接
func (b *binder) FindByID(userID int) (c *Conn, err error) {
b.mu.RLock()
defer b.mu.RUnlock()
if c, ok := b.userID2ConnMap[userID]; ok {
return c, nil
}
err = errors.New("该链接不存在,或已失效")
return
}
// FindIDByConn 通过连接去找 ID
func (b *binder) FindIDByConn(conn *Conn) (userID int, err error) {
b.mu.RLock()
defer b.mu.RUnlock()
for userID, c := range b.userID2ConnMap {
if c == conn {
return userID, nil
}
}
err = errors.New("该链接不存在,或已失效")
return
}
// GetAllBindConn 获取所有 绑定关系
func (b *binder) GetAllBindConn() map[int]*Conn {
return b.userID2ConnMap
}