默认
发表评论 1
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMSDK的iOS端在网络不通时发送消息也会返回0 成功?
问题描述:   MobileIMSDK的iOS端 和Server端是连接失败的, iOS端登录状态是失败的, 这个时候调用- (int) sendCommonDataWithStrNSString *)dataContentWidthStr toUserIdNSString *)to_user_id qosBOOL)QoS fpNSString *)fingerPrint withTypeuint)typeu;  发送消息返回0 成功。 按照正常的逻辑这个时候应该返回发送失败状态码。  请问一下这个是什么原因导致的?

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

标签:MobileIMSDK
上一篇:[已回复] 求教使用MobileIMSDK服务端定时对不同的组推送不同的消息下一篇:[已回复] 服务端sendOK为true,Android IOS端概率性丢包,收到消息不一致

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

推荐方案
评论 1
你的困惑很典型,但跟MobileIMSDK本身无关,跟UDP协议的特性有关。
UDP是无连接的,当你的手机网络正常(这个正常是指跟wifi或无线网能连上,而且至于你真的能不能上网,UDP没这能力,因为无连接),系统的API就能把UDP包送出,至于对方对不能收到,UDP协议是不知道的。所以你在用MobileIMSDK向服务器发数据,如果服务端连不上,但并不意味着UDP包发不出去(只是对方没收到而已,我的本系统认为包已经发出去了啊),所以返回0成功是符合UDP逻辑的。

其实主流的IM无论是用TCP还是UDP,从体验上来说差不多都是这样,以微信或手机QQ为例:在跟服务器网络不通的情况,你的消息一旦发出,消息气泡会有一个菊花在转动,如果收到对方的消息应答,菊花取消表示对方“已收到”,如果在超时时间内对方没有收到,会出现红色图标表示消息发送失败。MobileIMSDK里也是同样的逻辑:即你发的消息对方有没有收到,以对方的消息应答为主,否则就表示没有收到(不管你的包有没有送出,也就是你看到的返回0成功时,对方其实是收不到的,但不要紧:MobileIMSDK框架层有算法可以保证后绪通知你这个包对方没有收到

补充一点:其实IM里的消息发送和对方的接收应答过程,是个典型的异步逻辑,哪怕你用的是TCP协议也是一样,因为在大一点的IM系统用到多层架构或集群时,都不可能发送就立即得到结果。用异步的思想来理解IM数据的收发逻辑是比较恰当的

发送消息完成后:
[已回复] MobileIMSDK的iOS端在网络不通时发送消息也会返回0 成功?_222.jpg

超时时间内没有收到对方应答时:
[已回复] MobileIMSDK的iOS端在网络不通时发送消息也会返回0 成功?_WechatIMG448.jpeg

关于网络的健康状况跟IM特性的文章,你可以看看这篇(跟协议无关,TCP和UDP的情况类似):
为何基于TCP协议的移动端IM仍然需要心跳保活机制?

论坛里还有更多有关UDP的文章,你可以好好看看:
TCP/IP详解 - 第11章·UDP:用户数据报协议
简述传输层协议TCP和UDP的区别
为什么QQ用的是UDP协议而不是TCP协议?
移动端即时通讯协议选择:UDP还是TCP?
网络编程懒人入门(四):快速理解TCP和UDP的差异
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势
技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解
不为人知的网络编程(五):UDP的连接性和负载均衡
不为人知的网络编程(六):深入地理解UDP协议并用好它
不为人知的网络编程(七):如何让不可靠的UDP变的可靠?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部