默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 当MobileIMSDK的客户端收不到对方的ACK应答包时会发生什么?
关于使用IMSDK发包的问题:
我看sdk发送这儿的处理是发送的时候生成fingerprint,插入发送map中,收到回应后删除,QoS4SendDaemon会定期轮询进行重传
大于重传次数后移除。加入到lostMessages中
我想问的是如果对端收到了消息,但是回应丢了(包括重传也是)。那两端状态是不是就不正常了,一端是发送失败,但是另一端收到。
麻烦解答一下,还是有对应的处理我没看到

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

标签:MobileIMSDK
上一篇:[已回复] 服务端sendOK为true,Android IOS端概率性丢包,收到消息不一致下一篇:[已回复] 请教 MobileIMSDK 群聊接口、大文件上传下载接口

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

推荐方案
评论 5
你可以在对方接收到消息后再给发送方发送一条消息通知对方消息收到了
引用:liu1348789134 发表于 2018-03-02 15:47
你可以在对方接收到消息后再给发送方发送一条消息通知对方消息收到了

我的意思就是给发送方的消息通知丢了,这种情况导致的不一致IMSDK有没有处理
你可能没有仔细测试Demo程序,你可以暴力模拟测试一下网络不好的时候Demo的反应情况。

实际上,MobileIMSDK的消息送达保证机制(QoS机制)可以确保你发出的每一条消息只有两种结果:已送达和未送达。

你可以看看 MessageQoSEvent 这个回调接口:
[已回复] 当MobileIMSDK的客户端收不到对方的ACK应答包时会发生什么?_QQ截图20180302161104.png

总结下来就是:你发送的每一条消息,只要对方的ACK应答包没有送过来(这原因多了去了,但不管这些,反正就是没过来的话),MobileIMSDK的底层就会通过发送者这边的 MessageQoSEvent 回调方法 void messagesLost(java.util.ArrayList<net.openmob.mobileimsdk.server.protocal.Protocal> lostMessages) 来告诉你你刚才发送的哪条或哪几条消息没有成功送达,那么你的程序UI界面上,就可以像微信或手机QQ一样用一个红色图标告诉用户就可以了:
[已回复] 当MobileIMSDK的客户端收不到对方的ACK应答包时会发生什么?_WechatIMG448.jpeg
引用:JackJiang 发表于 2018-03-02 16:16
你可能没有仔细测试Demo程序,你可以暴力模拟测试一下网络不好的时候Demo的反应情况。

实际上,MobileIM ...

咱们已送达和未送达的判定是有没有收到ACK包。
那如果存在这种情况:
A 发送给B, 消息到达B,但是B的ACK 回应A没有收到。
那这时候A没有收到回应ACK会重发,重发后B的ACK回应A还是没有收到
A这时会回调messageLost方法,界面显示消息丢了。
但是B实际上是收到消息的。  这样两端状态就不一致了
引用:messi123 发表于 2018-03-02 16:32
咱们已送达和未送达的判定是有没有收到ACK包。
那如果存在这种情况:
A 发送给B, 消息到达B,但是B的A ...

首先:一次发送加上3次重传,能出现这种情况的几率太小了,即使出现了也没有办法。
做IM为种程序其实没有办法也没有必要保证所谓的百分百,从实际出发就好了,不然为了解决那0.001%的情况,要花费的成本估计是它实际价值的百倍了,得不偿失。

其实包括QQ在内,主流的IM也差不多是这个思路,就是允许“万有一失”情况存在,这是个聪明的权衡,必须IM消息从实际价值上讲,跟电商和订单完全没法比,极端情况下少看到一句两句问题并不大:
[已回复] 当MobileIMSDK的客户端收不到对方的ACK应答包时会发生什么?_QQ截图20180302165922.png
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部