iOS CocoaAsyncSocket总结

参考博客
最近看了看socket,也学习到了一点点东西,在这里记录一下,以免忘记。

socket能够实现两个应用程序之间的数据交换,比如说A和B用QQ聊天,就是A将数据发送给服务端,服务端将数据发送给B。这三者之间的数据发送、转换、接收,循环往复。
在发送数据的时候会出现粘包,断包的问题。在这里我学会了一种处理这种问题的思路。
首先要了解下面几个方法的作用

[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:110];

[sock readDataToLength:packetLength withTimeout:-1 tag:110];

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

[GCDAsyncSocket CRLFData] 可以直接理解为换行符 \n

第一个方法表示,读取数据,读取到\n这个位置停止。
第二个方法表示,按照数据的长度进行读取。
第三方方法表示,每次收到消息,都会调用这个方法。

我们发送数据的时候,都需要转化为data类型进行发送,所以说,我们可以取到每次发送数据的长度,data.length;
由于我们会发送字符串,图片,视频等等不同的类型,所以说,我们可以把类型,大小封装成一个json字符串,然后拼接上 \n,即 [GCDAsyncSocket CRLFData],然后我们再拼接上数据。

当服务端收到我们发送的数据时,调用[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:110]; 让其读到第一个 \n,然后获取到数据长度,调用[sock readDataToLength:packetLength withTimeout:-1 tag:110]; 服务端就能读取到我们这一次发送的数据,循环往复,直到读完为止。这样就不会出现粘包、断包的问题。
当然,处理这种问题的方法很多,只要能够实现功能,都可以。

测试
此时没有写服务端,怎么测试?

可利用:nc -lk 端口号:始终监听本地计算机此端口的数据。

eg:nc -lk 6666;

你可能感兴趣的:(iOS CocoaAsyncSocket总结)