reconnect

back_recharge
wangyuan 2019-08-27 17:38:22 +08:00
parent f05b764cfa
commit 43883d4722
1 changed files with 26 additions and 32 deletions

View File

@ -2,44 +2,31 @@ package com.ljsd.jieling.network.server;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.protobuf.GeneratedMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.ljsd.GameApplication;
import com.ljsd.common.mogodb.LjsdMongoTemplate;
import com.ljsd.jieling.battle.actor.Scene;
import com.ljsd.jieling.battle.actor.StateType;
import com.ljsd.jieling.battle.room.SceneManager;
import com.ljsd.jieling.config.SGlobalSystemConfig;
import com.ljsd.jieling.core.FunctionIdEnum;
import com.ljsd.jieling.core.HandlerLogicThread;
import com.ljsd.jieling.db.mongo.MongoUtil;
import com.ljsd.jieling.db.redis.RedisKey;
import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.exception.ErrorCode;
import com.ljsd.jieling.globals.Global;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.ktbeans.KtEventUtils;
import com.ljsd.jieling.ktbeans.parmsBean.ParamEventBean;
import com.ljsd.jieling.logic.OnlineUserManager;
import com.ljsd.jieling.logic.activity.ActivityLogic;
import com.ljsd.jieling.logic.activity.ActivityType;
import com.ljsd.jieling.logic.dao.LevelDifficulty;
import com.ljsd.jieling.logic.dao.PlayerManager;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.GuildLog;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.family.GuildLogic;
import com.ljsd.jieling.logic.fight.CombatLogic;
import com.ljsd.jieling.logic.room.Room;
import com.ljsd.jieling.logic.room.RoomManager;
import com.ljsd.jieling.logic.room.RoomPlayerInfo;
import com.ljsd.jieling.netty.cocdex.PacketNetData;
import com.ljsd.jieling.netty.cocdex.Tea;
import com.ljsd.jieling.netty.handler.GameMessageHandler;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocol.ProtocolsAbstract;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.RoomFightProto;
import com.ljsd.jieling.session.GameSession;
import com.ljsd.jieling.util.MathUtils;
import com.ljsd.jieling.util.MessageUtil;
@ -47,9 +34,6 @@ import com.ljsd.jieling.util.TimeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Encoder;
import java.io.*;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@ -130,6 +114,7 @@ public class ProtocolsManager implements ProtocolsAbstract {
iSession.setHeartBreatNums(heartBreatNums);
}
Gson gson = new Gson();
@Override
public void processMessage(GameSession gameSession, Object obj) {
@ -202,6 +187,13 @@ public class ProtocolsManager implements ProtocolsAbstract {
// MessageUtil.sendErrorCode(session,0,"您的账号token不正确请退出游戏重新登陆!");
// return;
// }
if( packetNetData.getMsgId()== MessageTypeProto.MessageType.RECONNECT_REQUEST_VALUE){
processReconnect(session);
LOGGER.info("the uid={} process reconnect",session.getUid());
return;
}
if (checkIndex(session,packetNetData) != 0){
return;
}
@ -209,11 +201,6 @@ public class ProtocolsManager implements ProtocolsAbstract {
if(b){
return;
}
if( packetNetData.getMsgId()== MessageTypeProto.MessageType.RECONNECT_REQUEST_VALUE){
processReconnect(session);
return;
}
//LOGGER.info("process the uid={},the msg={},the index={}",packetNetData.getUserId(), MessageTypeProto.MessageType.valueOf(packetNetData.getMsgId()),packetNetData.getIndex());
BaseHandler baseHandler = handlers.get(packetNetData.getMsgId());
if (baseHandler == null) {
LOGGER.info("request unknow commond : " + packetNetData.getMsgId());
@ -243,12 +230,13 @@ public class ProtocolsManager implements ProtocolsAbstract {
public void processReconnect(ISession session){
String key = RedisUtil.getInstence().getKey(RedisKey.INDICATION_OFFLINE, Integer.toString(session.getUid()));
Type type = new TypeToken<Map<Integer, ISession.IndicationMsg>>(){}.getType();
Map<Integer, ISession.IndicationMsg> map= gson.fromJson(RedisUtil.getInstence().get(key).toString(),type);
Object indicationInRedis = RedisUtil.getInstence().get(key);
int maxMsgId = 0;
if(map!=null && map.isEmpty()){
if(indicationInRedis!=null){
Map<Integer, ISession.IndicationMsg> map= gson.fromJson(indicationInRedis.toString(),type);
for(Map.Entry<Integer,ISession.IndicationMsg> info : map.entrySet()){
Integer msgIndex = info.getKey();
session.writeAndFlush(info.getValue());
session.writeAndFlush(info.getValue().getMsg());
session.putBackIndicationToMap(msgIndex,info.getValue().getMsg());
if(maxMsgId<msgIndex){
maxMsgId = msgIndex;
@ -256,16 +244,21 @@ public class ProtocolsManager implements ProtocolsAbstract {
}
RedisUtil.getInstence().del(key);
}
key = RedisUtil.getInstence().getKey(RedisKey.RESPONSE_OFFLINE, Integer.toString(session.getUid()));
type = new TypeToken<Map<Integer, byte[]>>(){}.getType();
Map<Integer, byte[]> response = gson.fromJson(RedisUtil.getInstence().get(key).toString(), type);
Object responsInRedis = RedisUtil.getInstence().get(key);
session.setFiveReady(1);
session.updateIndicationIndex(maxMsgId);
if(response!=null&&!response.isEmpty()){
session.setIndexToMessage(new ConcurrentHashMap<Integer, byte[]> (response));
session.setIndex(response.keySet().iterator().next());
RedisUtil.getInstence().del(key);
if(responsInRedis!=null){
Map<Integer, byte[]> response = gson.fromJson(responsInRedis.toString(), type);
if(response!=null && !response.isEmpty()){
session.setIndexToMessage(new ConcurrentHashMap<Integer, byte[]> (response));
Integer index = response.keySet().iterator().next();
session.setIndex(index);
RedisUtil.getInstence().del(key);
LOGGER.info("the uid={} cache repsponse is ={},session={}",session.getUid(),index,session.getCtx().channel());
}
}
MessageUtil.sendMessageWithoutBack(session,1, MessageTypeProto.MessageType.RECONNECT_RESPONSE_VALUE,null,true);
}
@ -308,11 +301,12 @@ public class ProtocolsManager implements ProtocolsAbstract {
int index = packetNetData.getIndex();
if (iSession.getIndex() >= index){
byte[] message = iSession.getCacheMessage(index);
if (message==null && packetNetData.getMsgId() != 11100){
if (message==null &&( packetNetData.getMsgId() != MessageTypeProto.MessageType.LOGIN_REQUEST_VALUE || packetNetData.getMsgId() != MessageTypeProto.MessageType.RECONNECT_REQUEST_VALUE)){
//TODO error
LOGGER.info("the uid={},the msg={} is processing",iSession.getUid(), MessageTypeProto.MessageType.valueOf(packetNetData.getMsgId()));
return 1;
}else {
LOGGER.info("the uid={},the msg={} reback",iSession.getUid(), MessageTypeProto.MessageType.valueOf(packetNetData.getMsgId()));
iSession.writeAndFlush(message);
return 1;
}