默认
发表评论 1
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 关于MobileIMSDK服务端在客户端非正常退出超时时间内失败回调的问题
请教一个问题,今天做了一下如下的测试,
1:启动俩个客户端,他们之间可以互相收发消息

2:将一个客户端A的网络断开
3:客户端B向A发送消息
4:可以看到在服务器端出现发送3次失败的日志,但是没有执行失败的回调函数 onTransBuffer_C2C_RealTimeSendFaild_CallBack
6:之后服务器才检测到客户端A离线(我们设置的敏感度为30秒)。
5:重新恢复客户端A的网络后,客户端A重试登录后也没有收到消息

想问一下未检测到离线的情况下发送消息失败是不会调用这个回调函数的吗?onTransBuffer_C2C_RealTimeSendFaild_CallBack。
这种情况导致丢失消息怎么处理?谢谢!

[DEBUG] - [17:50:48.924]【@】当前在线用户共(2)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [17:50:48.925]【DEBUG_回调通知】[typeu=-1]收到了客户端1发给客户端2的消息:str=3z | (ServerEventListenerImpl^onTransBuffer_C2C_CallBack:153)
[INFO] - [17:50:54.038][IMCORE]<< 收到客户端{uid:1}/180.169.42.178:4532的通用数据发送请求. | (ServerCoreHandler^messageReceived:203)
[DEBUG] - [17:50:54.038]【@】当前在线用户共(2)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [17:50:54.038]【DEBUG_回调通知】[typeu=-1]收到了客户端1发给客户端2的消息:str=3z | (ServerEventListenerImpl^onTransBuffer_C2C_CallBack:153)
[INFO] - [17:50:59.045][IMCORE]<< 收到客户端{uid:1}/180.169.42.178:4532的通用数据发送请求. | (ServerCoreHandler^messageReceived:203)
[DEBUG] - [17:50:59.045]【@】当前在线用户共(2)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [17:50:59.045]【DEBUG_回调通知】[typeu=-1]收到了客户端1发给客户端2的消息:str=3z | (ServerEventListenerImpl^onTransBuffer_C2C_CallBack:153)
[INFO] - [17:53:00.473][IMCORE]{uid:2}/180.169.42.178:4534的会话已关闭(user_id=2)了... | (ServerCoreHandler^sessionClosed:306)
[INFO] - [17:53:00.473].......... 【0】[当前正在被关闭的session] session.hashCode=974724611, session.ip+port=/180.169.42.178:4534 | (ServerCoreHandler^sessionClosed:311)
[INFO] - [17:53:00.473].......... 【1】[处于在线列表中的session] session.hashCode=974724611, session.ip+port=/180.169.42.178:4534 | (ServerCoreHandler^sessionClosed:316)
[DEBUG] - [17:53:00.474]【DEBUG_回调通知OnUserLogoutAction_CallBack】用户:2 离线了! | (ServerEventListenerImpl^onUserLogoutAction_CallBack:111)

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

标签:MobileIMSDK
上一篇:[已回复] 求教关于MobileIMSDK框架的敏感度模式设置下一篇:[已解决] MobileIMSDK调用GlobalSendHelper时,如何获得BridgeProcessor作为参数?

本帖已收录至以下技术专辑

推荐方案
评论 1
你的问题应该这样来理解:
1)当A刚离线(非正常退出),服务端没有到30秒超时时间,所以服务端其实根本不知道A是否在线(或者说,服务端认为A是在线的),因为它没有办法,只能等到心跳超时时间到后,才能准确地知道A不在线;
2)当1)这种情况发生时,B向A发送消息,A肯定收不到,服务端也不会走onTransBuffer_C2C_RealTimeSendFaild_CallBack,因为服务端一直认为它是在线的(因为没有到超时时间呢,A的状态还是一直是“在线”的);
3)1、2这种情况,在算法上来说,其实是正常的,因为MobileIMSDK的底层算法还有最后一层保证:即每一条消息,对方是否真的收到,是以发送者收到对方发过来的ACK确认包才算数的。所以,即使此时服务端把A当在线,把消息转发过去,且A没有收到的情况下,服务端也不会通知离线处理,这种逻辑也是合理的:因为B在这种情况下,就不会收到A的ACK包,在B这边,是可能通过MessageQoSListener收到哪些消息没有被对方收到的回调通知的,这种情况在,在主流的APP界面里,可以在消息气泡边上显示一个红色小图标,表示此条消息历经各种复杂情况,但不管怎么样,对方就是没有收到,就像下图这样:
[已回复] 关于MobileIMSDK服务端在客户端非正常退出超时时间内失败回调的问题_161644k2y29jo5fq5fo9q6.jpeg

综上所述,你帖子里提到的情况,其实是im通信过程中丛多复杂情况中的一种,但MobileIMSDK已经考虑到并通过回调告诉你了(只是这个回调通知是在客户端)。具体,你可以看看这个帖子里的讨论:《[已回复] 当MobileIMSDK的客户端收不到对方的ACK应答包时会发生什么?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部