默认
发表评论 4
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
iOS 用gcdAsyncSocket开发IM关于timeout的问题
阅读(47977) | 评论(4 收藏 淘帖1
1.客户端向服务端发一条消息,想知道服务端已经收到了,所以要求服务端收到后发一个“ACK包”回来,如果客户端n秒内没收到,就重发这条消息。因此我客户端置:[socket readDataWithTimeout:n tag:0],然后在读超时的代理中进行重发。
2.但因为是IM聊天,所以服务端也会主动把别的客户端发给我的消息转发过来,所以要readDataWithTimeout:-1不设置超时一直等待。

现在的问题:
在连接、登录鉴权之后,我就readDataWithTimeout:-1等待接服务器消息。但当我发消息给别人,readDataWithTimeout:n,但接收ACK是用readDataWithTimeout:-1来完成的,导致n秒后会告诉我读取超时。
经查资料得知,gcdAsyncSocket源码中是用一个队列来管理read任务的,一有回调就取队列的第一个read。所以说我就无法设置多种timeout了?而且tag参数也无法让我取得想要的read任务。那是不是要把timeout都统一成-1,然后根据个别需要ACK的业务另外开一个计时器去管理超时重发的问题?还是说有别的做法呢?

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

上一篇:IM客户端收到消息后,需要按接收到的时间进行排序,如何 实现比较好?下一篇:写一个IM服务端需要具备哪些技术能力?

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

推荐方案
评论 4
引用:JackJiang 发表于 2017-10-06 11:08
首先,你对TCP的理解可能是有问题的:
你跟服务器建立TCP连接后,这条连接就是个全双工的长连接,就像一条 ...

确实好像是理解错了,谢谢你的解答。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部