默认
发表评论 7
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
我的IM在线列表用户的切换导致出现短暂的连接失败
阅读(38735) | 评论(7 收藏 淘帖
场景是这样的,当用户进入APP的时候,会以设备信息imei连接IM服务,也就是说userId 和 token都是传入imei,连接成功,并将imei 对应的session放入离线列表中,当用户以用户名密码登陆APP的时候,我需要将他从离线列表切换到在线列表,去除掉离线列表中imei 信息,放入userid 对应session到在线列表,这会的session即是之前imei存入离线的session ,在我感觉通讯应该一直通着,但客户端这边有时候 就会收到  “尚未登录,发起登陆请求” 这样的信息,重新连接IM服务。
      目前我分析 觉得是 当我在切换的时候,首先会从离线列表中删除imei信息,再以useId 存入在线列表,我觉得是在这个时候 客户端由于在列表中没有找到,而给客户端了一个尚未登陆的假象,不知道我的猜想对不对,希望各位大婶 能帮忙想想

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

上一篇:[已回复] 关于MobileIMSDK的iOS版收到消息应答回调的疑问下一篇:IM聊天界面ui显示的消息发送时间和我接收到的时间 ,如何实现比较好?
推荐方案
评论 7
你的逻辑需要优化:
肯定是先放入在线列表后,再删除原来的离线列表。考虑到极端情况下,如果在线列表加入失败,而你离线列表也已被删除,这该怎么办等等。你先删除后加的逻辑是不够健壮的。
引用:JackJiang 发表于 2017-09-27 21:58
你的逻辑需要优化:
肯定是先放入在线列表后,再删除原来的离线列表。考虑到极端情况下,如果在线列表加入 ...

客户端在什么情况会出现 尚未登录的信息? 是 响应包没有收到?还是有其它的判别方式?好像看代码只有这一种情况吧
引用:柳老三 发表于 2017-09-27 22:10
客户端在什么情况会出现 尚未登录的信息? 是 响应包没有收到?还是有其它的判别方式?好像看代码只有这 ...

唯一的情况就是服务端的用户列表中没有它,但实际上它的session在MINA这一层还是正常的,极有可能是你错误地删除了。复现这个问题很简单,你就用一个客户端,针对性的测试的你的代码肯定可以复现,并找出问题的。
引用:JackJiang 发表于 2017-09-27 21:58
你的逻辑需要优化:
肯定是先放入在线列表后,再删除原来的离线列表。考虑到极端情况下,如果在线列表加入 ...

还有就是我在切换的时候,首先以imei去离线中去查找session,找不到的话 我会试着去在线中找,如果俩者都没有找到,我是不是需要给客户端返回个错误码,让客户端重新连接一次

3.png (34.82 KB, 下载次数: 2468)

3.png
其实我想问的是,你为什么要弄两个列表呢。

你的需求其实可以这样:原先的列表还是那个列表,只是登陆的时候带上来的参数不一样(存到它在服务端的session里),当它的身份转换了之后,你更新这个session里的这个存的字段值内容,这样的话不就不需要改变整个算法框架了,难度要小多了。

至于你怎么用这个列表里的数据,你根据这个字段的值再来区分一下,这样的修改就要优雅多了。

我不清楚你具体要的是什么,但解决问题通常回归到本质就能找到最省事的方法,通常简单的就是最好的。一定不要搞复杂,否则会越来越复杂,直到失控。
引用:JackJiang 发表于 2017-09-28 10:46
其实我想问的是,你为什么要弄两个列表呢。

你的需求其实可以这样:原先的列表还是那个列表,只是登陆的 ...

  多谢  多谢  
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部