AsyncSocket长连接棒包装问题解决

AsyncSocket长连接棒包装问题解决

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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];
}



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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117542.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月4日 上午7:00
下一篇 2022年1月4日 上午8:00


相关推荐

  • 树莓派能做什么知乎_树莓派能做哪些电脑和手机都做不了的事情?

    树莓派能做什么知乎_树莓派能做哪些电脑和手机都做不了的事情?题主这个问题其实是有代表性的,有疑问的原因,主要是没找准参照物。树莓派是300元价位,同时兼具完整软件系统(Linux)与硬件交互能力的最优选择。不能拿它和手机相比的原因很多。第一,手机没有方便好用的硬件接口,就算免费送几个电机、舵机也不知道怎么和手机连。但是用树莓派搭配很少的硬件就能做出机器人来。第二,价格。很弱的手机也得大几百元。而树莓派几乎是一个消耗品,比如做一个硬件作品就需要至少占用一个树…

    2022年6月1日
    39
  • js 实现纯前端将数据导出excel两种方式,亲测有效「建议收藏」

    由于项目需要,需要在不调用后台接口的情况下,将json数据导出到excel表格,参考了好多资料以及很多大佬写的博客终于实现,兼容chrome没问题,其他还没有测试过,这边介绍两种实现方式,并附上代码和gif动图,博主不才还望轻喷

    2022年4月17日
    60
  • css背景渐变兼容性问题解决

    css背景渐变兼容性问题解决background webkit linear gradient right 9EC2340 background moz linear gradient right 9EC2340 background o linear gradient right 9EC2340 background linear gradient toright 9EC2340

    2025年7月8日
    4
  • Oracle基础(五)pl/sql进阶(分页过程)

    Oracle基础(五)pl/sql进阶(分页过程)

    2022年1月19日
    42
  • Java函数式编程之Java8四大函数接口

    【前序】:在Java8中,内置了四个核心函数接口,它们存在是Lamda表达式出现的前提,Lamda表达式想重写函数式接口中的唯一方法。函数式接口与Lambda表达式之间的关系:lambda表达式相当于是一个行为,传入函数式接口中,进来实现各种操作。它们的接口内只有一个抽象方法,每一个函数式接口都有@FunctionalInterface注解。文章目录1.消费型接口2.供给型接口3.函数型接…

    2022年4月16日
    50
  • lua中的weak table及内存回收collectgarbage

    弱表(weaktable)是一个很有意思的东西,像C++/Java等语言是没有的。弱表的定义是:Aweaktableisatablewhoseelementsareweakreferences,元素为弱引用的表就叫弱表。有弱引用那么也就有强引用,有引用那么也就有非引用。我们先要厘这些基本概念:变量、值、类型、对象。(1)变量与值:Lua是一个dynamicallyty

    2022年4月7日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号