美文网首页
iOS CocoaAsyncSocket总结

iOS CocoaAsyncSocket总结

作者: 我想走走 | 来源:发表于2018-05-26 01:06 被阅读239次

    参考博客
    最近看了看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总结

          本文链接:https://www.haomeiwen.com/subject/fyypjftx.html