默认
发表评论 11
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
iOS上用GCDAsyncSocket 开发的IM,didReadData调用次数不对
阅读(61604) | 评论(11 收藏 淘帖
1金币
目前在做ios客户端IM开发,用的框架是GCDAsyncSocket。现在碰到一个问题,就是当服务器一次性发送多条消息的时候,didreadData方法只会走一次,偶尔会出现走两次,也就是收到两条消息。这是从后台回来去收取离线消息的时候发生的状况,如果程序没在后台,那么无论发消息多频繁,或者多人发消息都能收到,谁知道这可能的原因是什么吗?

上一篇:请问IM中消息推送中如何实现消息中转投递?下一篇:求助将c语言的这段代码翻译成javascript代码
推荐方案
评论 11
引用:pyf0110 发表于 2017-09-05 16:45
好像是你所说的粘包问题,现在发现问题是这样子的,如果服务器一次性向我发了5条消息,第一条是完整的没 ...

这个就是粘包问题, 我们这边添加了头和尾解决了 应该只添加头就可以解决的 网上搜iOS TCP 粘包问题 有个简述能解决 算了 我找一下网址发给你粘包问题
引用:pyf0110 发表于 2017-09-05 16:46
我是想用http,但是服务器非要用socket通道

学会甩锅。。。
后面要再加类似的功能,你会越来越烦
引用:JackJiang 发表于 2017-09-05 16:20
估计是你代码的问题。不过,这离线消息用http的“拉”方式不就简单通用多了吗

我是想用http,但是服务器非要用socket通道
引用:dsperson 发表于 2017-09-05 11:53
是啊 我弄粘包问题也弄了好久 一大半锅在服务器上 很坑

好像是你所说的粘包问题,现在发现问题是这样子的,如果服务器一次性向我发了5条消息,第一条是完整的没问题,后面4条拼在一个data里面发过来了。但是安卓那边是一条一条的。
引用:pyf0110 发表于 2017-09-05 16:08
可以先不管apns的问题,目前还没做到apns这一步。现在的机制是当退到后台的时候断开连接,然后别人发过来 ...

估计是你代码的问题。不过,这离线消息用http的“拉”方式不就简单通用多了吗
引用:JackJiang 发表于 2017-09-05 10:08
你的问题有点乱,你的问题涉及到APNS和GCDAsyncSocket的TCP传输,但到底是什么问题,你能描述地清楚有逻辑 ...

可以先不管apns的问题,目前还没做到apns这一步。现在的机制是当退到后台的时候断开连接,然后别人发过来的消息就存储在服务器上。等app进入前台之后重新连接,然后服务器把消息通过socket通道一条一条的发过来,现在的问题就是didReadData方法只走一次或者两次,比如别人发了5条消息我只能收到第一次和第二次发送的消息。
引用:dsperson 发表于 2017-09-05 11:53
是啊 我弄粘包问题也弄了好久 一大半锅在服务器上 很坑

希望你在3楼的回复能解决楼主的问题
引用:JackJiang 发表于 2017-09-05 11:41
楼主的问题里一会又是前台,一会又是服务端大量发,很难猜出到底是哪个环节出的问题,逻辑有点混乱

是啊 我弄粘包问题也弄了好久 一大半锅在服务器上 很坑
引用:dsperson 发表于 2017-09-05 11:32
didreadData 走一次或者多次, 是因为TCP的缓冲区数据没有读取完毕. 使用[_tcp readDataWithTimeout:-1 tag: ...

楼主的问题里一会又是前台,一会又是服务端大量发,很难猜出到底是哪个环节出的问题,逻辑有点混乱
didreadData 走一次或者多次, 是因为TCP的缓冲区数据没有读取完毕. 使用[_tcp readDataWithTimeout:-1 tag:tag]; 即可, 记得解决粘包问题就可以了. APNs 的问题没听懂
你的问题有点乱,你的问题涉及到APNS和GCDAsyncSocket的TCP传输,但到底是什么问题,你能描述地清楚有逻辑一些吗。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部