From 095deb582b3bb6409f1b912cf8cb641bd3fc77ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E5=8B=87?= Date: Thu, 21 Sep 2023 14:51:40 +0800 Subject: [PATCH] reconnection --- server/imserver/constant.go | 4 ++++ server/imserver/handlermgr.go | 1 + server/imserver/player.go | 16 ++++++++++++---- server/imserver/playermgr.go | 20 ++++++++++++++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/server/imserver/constant.go b/server/imserver/constant.go index 68372bdb..6db03a23 100644 --- a/server/imserver/constant.go +++ b/server/imserver/constant.go @@ -89,6 +89,10 @@ const ( // Err code ERR_CODE_OK = 0 + // Login and Reconnect + ERR_CODE_RECONNECT_PLAYER_NO_EXISTS = 10001 + ERR_CODE_RECONNECT_PLAYER_SESSION_ID_NO_VALID = 10002 + // Friemds ERR_CODE_USERS_NO_EXISTS = 11001 ERR_CODE_FRIENDSHIP_IS_FULL = 11002 diff --git a/server/imserver/handlermgr.go b/server/imserver/handlermgr.go index e401c77b..2d5fccb3 100644 --- a/server/imserver/handlermgr.go +++ b/server/imserver/handlermgr.go @@ -14,6 +14,7 @@ func (this *HandlerMgr) init() { cs.RegHandlerId(int(cs.CMMessageIdE__CMPing), PLAYER_MGR_HANDLER_ID) cs.RegHandlerId(int(cs.CMMessageIdE__CMLogin), PLAYER_MGR_HANDLER_ID) + cs.RegHandlerId(int(cs.CMMessageIdE__CMReconnect), PLAYER_MGR_HANDLER_ID) // 好友 cs.RegHandlerId(int(cs.CMMessageIdE__CMSearchUser), PLAYER_HANDLER_ID) diff --git a/server/imserver/player.go b/server/imserver/player.go index 1dc3ba97..bf593b5d 100644 --- a/server/imserver/player.go +++ b/server/imserver/player.go @@ -27,6 +27,18 @@ func (p *Player) GetSessionId() string { return p.sessionId } +func (p *Player) SendMsg(rspMsg proto.Message) { + wspListener.sendProxyMsg(p.socket.Conn, p.socket.SocketHandle, rspMsg) +} + +func (p *Player) ReBind(socket f5.WspCliConn) { + if p.socket.IsValid() { + delete(playerMgr.socketHash, p.socket) + } + p.socket = socket + playerMgr.socketHash[p.socket] = p +} + // CMSearchUser 搜索用户 func (p *Player) CMSearchUser(hdr *f5.MsgHdr, msg *cs.CMSearchUser) { sinceId := msg.GetSinceId() @@ -279,10 +291,6 @@ func (p *Player) MarkNewMsg() { p.SendMsg(rspMsg) } -func (p *Player) SendMsg(rspMsg proto.Message) { - wspListener.sendProxyMsg(p.socket.Conn, p.socket.SocketHandle, rspMsg) -} - func IsValidChatChannel(chatChannel int32) bool { return chatChannel > kCCBegin && chatChannel < kCCEnd } diff --git a/server/imserver/playermgr.go b/server/imserver/playermgr.go index 7d664029..af9cb12b 100644 --- a/server/imserver/playermgr.go +++ b/server/imserver/playermgr.go @@ -5,6 +5,7 @@ import ( "encoding/json" "f5" "fmt" + "github.com/golang/protobuf/proto" "mt" "q5" ) @@ -198,3 +199,22 @@ func (this *PlayerMgr) GetOnlineStatus(accountId string) int32 { } return OnlineStatusOff } + +func (this *PlayerMgr) CMReconnect(hdr *f5.MsgHdr, msg *cs.CMReconnect) { + hum := this.GetPlayerByAccountId(msg.GetAccountId()) + rspMsg := &cs.SMReconnect{} + if hum == nil { + rspMsg.Errcode = proto.Int32(ERR_CODE_RECONNECT_PLAYER_NO_EXISTS) + rspMsg.Errmsg = proto.String("player no exists") + wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) + return + } + if hum.GetSessionId() != msg.GetSessionId() { + rspMsg.Errcode = proto.Int32(ERR_CODE_RECONNECT_PLAYER_SESSION_ID_NO_VALID) + rspMsg.Errmsg = proto.String("session id no valid") + wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) + return + } + hum.ReBind(hdr.GetSocket()) + wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) +}