69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
package logic
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"fusenapi/constants"
|
|
"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
|
|
}
|
|
lenClientId := len(clientId)
|
|
//id长度不对
|
|
if lenClientId > 100 {
|
|
w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "length of client id is to long"))
|
|
return
|
|
}
|
|
//合成client后缀,不是同个后缀的不能复用
|
|
userPart := getUserJoinPart(w.userId, w.guestId)
|
|
lenUserPart := len(userPart)
|
|
if lenClientId <= lenUserPart {
|
|
w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "length of client id is to short"))
|
|
return
|
|
}
|
|
//尾部不同不能复用
|
|
if clientId[lenClientId-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)
|
|
}
|