请选择 进入手机版 | 继续访问电脑版

默认
发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 求助修改MobileIMSDK的IM实现互踢功能后,发生的异常情况
问题场景:     android端app启动后执行自动重连,重连成功后过一会又会重连,第二次重连的时候服务端中session的hashCode会变化,导致服务端认为是该账号在其他设备登录,然后发送前一个设备退出命令,当前手机会收到这个命令。

重新连接session断开后生成新的session这里我能理解,但是旧的那个session还能收到指令,这就有点问题了,该如何解决?


服务端配置如下:

我们使用的是新版本的TCP协议

服务端针对不同设备登录只在OnlineProcessor里面自定义了一个异常参数发送给客户端作为其他设备登录的指令

public void putUser(String user_id, Channel session)
{
   if(onlineSessions.containsKey(user_id))
   {
      logger.info("[IMCORE-{}]【注意】用id={}在在线列表中了,session也是同一个吗{}++{}++{}"
, Gateway.$(session), user_id,onlineSessions.get(user_id).hashCode(), session.hashCode(),(onlineSessions.get(user_id).hashCode() == session.hashCode()));
         
      // TODO 同一账号的重复登陆情况可在此展开处理逻辑
if(onlineSessions.get(user_id).hashCode() != session.hashCode()) {

         Protocal perror = ProtocalFactory.createPErrorResponse(
               // 将原Protocal包的JSON作为错误内容原样返回(给客户端)
ErrorCode.ForS.RESPONSE_FOR_OTHER_LOGIN, "", "-1"); Channel channel = onlineSessions.get(user_id);
         try{
            LocalSendHelper.sendData(channel, perror, null);
         }catch (Exception e){}

      }
   }
   onlineSessions.put(user_id, session);
   __printOnline();// just for debug
}

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:零基础IM开发入门(四):什么是IM系统的消息时序一致性?下一篇:这张IM架构图里为何消息到达logic后继续往后还要用到mq?
推荐方案
评论 3
你的意思是,你想实现同一账号,不同设备登陆时,进行互踢这个功能是吗?

然后在自已增加了这块的逻辑控制后,出现了逻辑问题?
签名: 《Java对IPv6的支持详解:支持情况、相关API、演示代码等》:http://www.52im.net/thread-3236-1-1.html
引用:JackJiang 发表于 2020-10-27 15:58
你的意思是,你想实现同一账号,不同设备登陆时,进行互踢这个功能是吗?

然后在自已增加了这块的逻辑控 ...

是的,原意是用来踢出功能的,加了这个后只使用一台手机,重连后自己都有可能被踢掉
引用:刘贵林 发表于 2020-10-27 16:18
是的,原意是用来踢出功能的,加了这个后只使用一台手机,重连后自己都有可能被踢掉

你这代码里判定是不是不同的客户端,逻辑显然是不对的。

这是你没有改动代码前的默认代码:
        public void putUser(String user_id, Channel session)
        {
                if(onlineSessions.containsKey(user_id))
                {
                        logger.debug("[IMCORE-{}]【注意】用户id={}已经在在线列表中了,session也是同一个吗?{}"
                                        , Gateway.$(session), user_id, (onlineSessions.get(user_id).hashCode() == session.hashCode()));
                        
                        // TODO 同一账号的重复登陆情况可在此展开处理逻辑
                }
                onlineSessions.put(user_id, session);
                __printOnline();// just for debug
        }

你增加的代码,是依赖于hashcode来判定不同的客户端,这当然不对啦(同一个客户端在断线重连的情况下,channel肯定就是不同的了,但这跟不同的客商用端是两码)。

默认代码里的这段log只是用于曾今的同一个客户端的某个bug调试而遗留,并不是用于区别不同的客户端之用。

你看一下我在这个帖子里的回复:[已回复] O求教MobileIMSDK实现多端登陆互踢功能的疑问》,务必仔细理解。
签名: 《Java对IPv6的支持详解:支持情况、相关API、演示代码等》:http://www.52im.net/thread-3236-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部