package logic //复用websocket连接标识 import ( "encoding/json" "fmt" "fusenapi/constants" "fusenapi/utils/encryption_decryption" "github.com/zeromicro/go-zero/core/logx" ) // 刷新重连请求恢复上次连接的标识 func (w *wsConnectItem) reuseLastConnect(data []byte) { logx.Info("收到请求恢复上次连接标识数据:", string(data)) var clientId string if err := json.Unmarshal(data, &clientId); err != nil { logx.Error(" invalid format of client id :", clientId) w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "invalid format of client id")) return } //解密 decryptionClientId, err := encryption_decryption.CBCDecrypt(clientId) if err != nil { w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "invalid client id")) return } lendecryptionClientId := len(decryptionClientId) //合成client后缀,不是同个后缀的不能复用 userPart := getUserJoinPart(w.userId, w.guestId) lenUserPart := len(userPart) if lendecryptionClientId <= lenUserPart { w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "length of client id is to short")) return } //尾部不同不能复用 if decryptionClientId[lendecryptionClientId-lenUserPart:] != userPart { w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "the client id is not belong you before")) return } publicMutex.Lock() defer publicMutex.Unlock() //存在是不能给他申请重新绑定 if v, ok := mapConnPool.Load(clientId); ok { obj, ok := v.(wsConnectItem) if !ok { logx.Error("连接断言失败") } //是当前自己占用 if obj.uniqueId == w.uniqueId { //重新绑定 w.uniqueId = clientId rsp := w.respondDataFormat(constants.WEBSOCKET_CONNECT_SUCCESS, clientId) w.sendToOutChan(rsp) return } else { rsp := w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "id has bound by other connect ") w.sendToOutChan(rsp) return } } //重新绑定 w.uniqueId = clientId rsp := w.respondDataFormat(constants.WEBSOCKET_CONNECT_SUCCESS, clientId) w.sendToOutChan(rsp) return } // 获取用户拼接部分(复用标识用到) func getUserJoinPart(userId, guestId int64) string { return fmt.Sprintf("|_%d_%d_|", userId, guestId) }