|
|
@@ -34,16 +34,17 @@ func subStr(str string, length int) string {
|
|
|
}
|
|
|
|
|
|
type Hub struct {
|
|
|
- sync.Mutex
|
|
|
- ctx context.Context // 为了方便退出而建立
|
|
|
- cancel context.CancelFunc
|
|
|
- cf *config.Config
|
|
|
- globalID uint16
|
|
|
- channel string // 本地频道信息
|
|
|
- middle []MiddleFunc // 中间件
|
|
|
- lines *Mapx // 记录当前的连接,统一管理
|
|
|
- subscribes sync.Map // [cmd]->[]*SubscribeData //注册绑定频道的函数,用于响应请求
|
|
|
- msgCache sync.Map // map[uint16]*GetMsg //请求的回应记录,key为id
|
|
|
+ ctx context.Context // 为了方便退出而建立
|
|
|
+ cancel context.CancelFunc
|
|
|
+ cf *config.Config
|
|
|
+ connectMutex sync.Mutex
|
|
|
+ idMutex sync.Mutex
|
|
|
+ globalID uint16
|
|
|
+ channel string // 本地频道信息
|
|
|
+ middle []MiddleFunc // 中间件
|
|
|
+ lines *Mapx // 记录当前的连接,统一管理
|
|
|
+ subscribes sync.Map // [cmd]->[]*SubscribeData //注册绑定频道的函数,用于响应请求
|
|
|
+ msgCache sync.Map // map[uint16]*GetMsg //请求的回应记录,key为id
|
|
|
|
|
|
// 客户端需要用的函数(服务端可为空)
|
|
|
connectHostFunc ConnectHostFunc // 获取对应频道的一个连接地址
|
|
|
@@ -113,8 +114,8 @@ func (h *Hub) cleanDeadConnect() {
|
|
|
|
|
|
// 获取通讯消息ID号
|
|
|
func (h *Hub) GetID() uint16 {
|
|
|
- h.Lock()
|
|
|
- defer h.Unlock()
|
|
|
+ h.idMutex.Lock()
|
|
|
+ defer h.idMutex.Unlock()
|
|
|
h.globalID++
|
|
|
if h.globalID <= 0 || h.globalID >= config.ID_MAX {
|
|
|
h.globalID = 1
|
|
|
@@ -663,6 +664,8 @@ func (h *Hub) BindForServer(info *HostInfo) (err error) {
|
|
|
// 新建一个连接,不同的连接协议由底层自己选择
|
|
|
// channel: 要连接的频道信息,需要能表达频道关键信息的部分
|
|
|
func (h *Hub) ConnectToServer(channel string, force bool, host *HostInfo, autoReconnect bool) (err error) {
|
|
|
+ h.connectMutex.Lock()
|
|
|
+ defer h.connectMutex.Unlock()
|
|
|
// 检查当前channel是否已经存在
|
|
|
if !force {
|
|
|
line := h.ChannelToLine(channel)
|