分享

ios上socket通信问题(已解决,并附上解决方式)

 叹落花 2015-10-02

小生最近做个产品 socket通信,对这块了解甚少,同样对C也了解甚少。把需要的功能实现了,但是异常方面总觉得应该做些什么,但不了解有什么地方需要实现。

服务器过来的是逐桢图片,大概的实现流程,使用的AsyncSocket,服务器发送数据量,先放入NSMutableData *totalData中,每过来一个数据就appendData,加入到totalData里面,然后到数据模块里面对16进制数据进行处理,得到一张完整的图片后将其从toatlData中使用subdataWithRange将其remove.

因为测试环境也是我自个搭建的,不知道正常使用下会有多少异常,我有几个疑惑的地方: 1,我没实现ringbuffer,直接通过NSMutableData来处理,这个会有影响不? 2,对于数据的接受方面,直接append会不会有数据错位的情况,对于数据的部分丢失一般是直接remove掉还是保留? 3,每接受到一次数据才处理一次。也就是说每响应一次socket的delegate才处理一次数据会不会太慢?

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

问个额外的问题,jpg序列组合成一个视频有什么好方法?


2013,6,21

这个问题早已解决,我就在这边给个完整的解释吧,

1,关于接收数据那块,didReadData的delegate中用一个NSMutableData即可,接收到数据后先判断,看是否需要使用appendData加入进来,如果刚好读取完一个完整的数据,先copy出来去操作,并将NSMutableData设置为nil,下一个数据进来重新初始化并添加。这样保证内存中最多只有一个完整的数据。 而且处理完就得继续readData。

2,关于数据的容错,是否完整这个就得根据文件桢头来进行判断,客户端自己决定如何丢弃。

3,实际上接收的速度是和服务器发送的速度相关的,服务器控制发送时间间隔即可。客户端就得不断的读取,操作。

最后如何组合图片序列为视频 使用AVAssetWriter即可,可以控制每秒多少张,包括储存的格式,没必要去使用ffmpeg或者自己写数据头。

1

如果你用的是TCP socket的话,保证数据包的发送顺序正确和不丢包是TCP协议的事,你的应用不用担心这个。

#1 coder · 2013年05月15日 · 回复 举报

添加评论

1 个回答

2
采纳
chinaxxren 75 2013年05月14日 回答

你发送端就要序列化数据,接收端就不会错位的。一般情况下是不会产生错位的。每次接收数据你可以计算NSData的大小的,不需要使用什么subdataWithRange,最好的好就是使用append。delegate这个是接收到一定的长度或者小于这个长度就会delegate。如果数据量很大的话,会产生分成很多个数据包传输。所以一次delegate有可能不是一个完整的数据。

 

谢谢回复,数据是多次的append才会完整。我考虑下这个nsdata直接计算而不用subdata。

#1 navy · 2013年05月14日 · 回复 举报

 
回复 navy

我项目用的就是nsdata,没有任何问题

#2 chinaxxren · 2013年05月14日 · 回复 举报

 
回复 chinaxxren

恩,谢谢了,那我问个问题,读取数据是否得client定时去read服务器过来的数据?我数据分成1k的大小,10s服务器发一次,丢包很严重,问下这有什么可能?

#3 navy · 2013年05月15日 · 回复 举报

 

亲,你使用的socket长连接,不是http还轮询做什么!

#4 chinaxxren · 2013年05月15日 · 回复 举报

 
回复 chinaxxren

我晕,原来是用anyscsocket 每一次读完后得在delegate中继续[sock readDataWithTimeout:-1 tag:0];服务器的话在每一次发送后就继续[sock writeData:d withTimeout:-1 tag:0]; thx。

#5 navy · 2013年05月15日 · 回复 举报

 

不清楚你什么意思~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多