fusenapi/server/websocket/internal/logic/ws_reuse_last_connect.go

72 lines
2.3 KiB
Go
Raw Normal View History

2023-08-15 10:14:44 +00:00
package logic
2023-08-23 07:08:45 +00:00
//复用websocket连接标识
2023-08-15 10:14:44 +00:00
import (
"encoding/json"
2023-08-18 09:33:42 +00:00
"fmt"
2023-08-15 10:14:44 +00:00
"fusenapi/constants"
2023-08-23 08:45:01 +00:00
"fusenapi/utils/encryption_decryption"
2023-08-15 10:14:44 +00:00
"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
}
2023-08-23 08:45:01 +00:00
//解密
decryptionClientId, err := encryption_decryption.CBCDecrypt(clientId)
if err != nil {
w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "invalid client id"))
2023-08-15 10:14:44 +00:00
return
}
2023-08-23 08:45:01 +00:00
lendecryptionClientId := len(decryptionClientId)
2023-08-15 10:38:33 +00:00
//合成client后缀,不是同个后缀的不能复用
2023-08-18 09:33:42 +00:00
userPart := getUserJoinPart(w.userId, w.guestId)
2023-08-15 10:38:33 +00:00
lenUserPart := len(userPart)
2023-08-23 08:45:01 +00:00
if lendecryptionClientId <= lenUserPart {
2023-08-15 10:38:33 +00:00
w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "length of client id is to short"))
return
}
//尾部不同不能复用
2023-08-23 08:45:01 +00:00
if decryptionClientId[lendecryptionClientId-lenUserPart:] != userPart {
2023-08-15 10:38:33 +00:00
w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_REQUEST_RESUME_LAST_CONNECT_ERR, "the client id is not belong you before"))
return
}
2023-08-15 10:14:44 +00:00
publicMutex.Lock()
defer publicMutex.Unlock()
//存在是不能给他申请重新绑定
2023-08-18 03:05:18 +00:00
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
}
2023-08-15 10:14:44 +00:00
}
//重新绑定
w.uniqueId = clientId
rsp := w.respondDataFormat(constants.WEBSOCKET_CONNECT_SUCCESS, clientId)
w.sendToOutChan(rsp)
return
}
2023-08-18 09:33:42 +00:00
// 获取用户拼接部分(复用标识用到)
func getUserJoinPart(userId, guestId int64) string {
2023-08-23 09:03:04 +00:00
return fmt.Sprintf("|_%d_%d_|", userId, guestId)
2023-08-18 09:33:42 +00:00
}