• AsyncSocket长连接棒包装问题解决


    project正在使用长连接快来server沟通。因此,指定我们的协议前两个字节为数据长度来区分数据包


    app这边数据有两种传输形式:

    1.app主动请求所须要的数据;

    2.app异步接收来自服务端的推送消息,也就是app这边没有请求。服务端主动发送数据到appclient。


    整个app执行期间,它们都是在同一个连接上完毕的传输数据。因此会出现下面的问题:

    1.server传输数据过快,出现粘包的问题,比如

        1.1服务端一次发来多个推送消息;

        1.2网络不稳定,client连续发送多个请求client一次接收到所有答复。

    2.client的一个请求报文,服务端的应答报文数据过大。到IP层须要进行分片,因此client这边就会出现几次才接收到完整的数据的情况;


    首先有下面4个方法须要介绍

    /**

     **实例方法

     **调用此方法以后,当套接字接收缓冲区有可用字节的时候。会触发onSocket:didReadData:withTag:托付方法。此时接收到的数据会出现上面说到的问题

     */

    - (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;


    /**

     **实例方法

     **调用此方法以后。当套接字接收缓冲区有length长度的可用字节的时候,会触发onSocket:didReadData:withTag:托付方法,此时接收到固定长度的数据,这个固定长度就是length给出的值,当length的长度大于接收缓冲区数据的长度的时候,就会等待,直到接收到length长度的数据的时候才会触发以上托付方法的调用

     */

    - (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;


    /**

     **实例方法

     **此方法功能同上,仅仅是多了几个參数buffer是你将接收的数据写到的地方,offset是写到buffer中的偏移位置

     */

    - (void)readDataToLength:(NSUInteger)length

                 withTimeout:(NSTimeInterval)timeout

                      buffer:(NSMutableData *)buffer

                bufferOffset:(NSUInteger)offset

                         tag:(long)tag;


    /**

     **托付方法

     **此方法上面已经说到

     */

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


    解决方法:

    client每次发送请求以后。首先仅仅接收两个字节的长度字节,例如以下:

    [sendSocket readDataToLength:2 withTimeout:set.timeout tag:tag];
    [sendSocket writeData:data withTimeout:set.timeout tag:tag];

    然后当有可用字节到达套接字接收缓冲区的时候触发下面托付方法,我们在里面做例如以下处理,这样既攻克了粘包的问题,也攻克了数据过大。多次接收完整的问题;

    - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)_data withTag:(long)tag
    {
        SettingData* set = [SettingData shareSettingData];
        
        if (respondData == nil) {
            respondData = [[NSMutableData alloc]init];
            respondDataLen = [RequestUnit respondMessageLengthWithData:_data];
            [sock readDataToLength:respondDataLen withTimeout:set.timeout tag:tag];
            return;
        }
        [respondData appendData:[RequestUnit respondBytesToUTF8Data:_data]];
        [self parserData:respondData withTag:tag];
    }


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    iOS6和iOS7代码的适配(5)——popOver
    es5创建对象与继承
    js学习日记-new Object和Object.create到底干了啥
    js滚动及可视区域的相关的操作
    css匹配规则及性能
    normalize.css源码分析
    css的水平居中和垂直居中总结
    js快速排序算法
    数据结构flash演示
    二叉树遍历
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4646428.html
Copyright © 2020-2023  润新知