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



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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pci-e mini pci-e 接口区别_创维42E510E怎么进总线

    pci-e mini pci-e 接口区别_创维42E510E怎么进总线固态硬盘的出现,彻底打破了机械硬盘多年来在电脑硬件领域的统治地位。相比于机械硬盘,固态硬盘更高的传输性能,让普通用户和发烧玩家的使用体验均得到了成倍的提升。在这场存储的革命中,为了实现更快的速度、更广的使用环境和更好的体验,硬盘接口技术也在不断进化革新,从早期的IDE、SCSI接口到主流的SATA、SAS接口,再到M.2、PCIe接口。原文链接:https://blog.csdn.net/A993852/article/details/108957202PCI-E接口PCI-E接口:在传统SATA

  • Java 异常错误 (Ljava/lang/String;)L java/lang/String;「建议收藏」

    Java 异常错误 (Ljava/lang/String;)L java/lang/String;「建议收藏」异常问题如下:起初xml中返回值类型是这样子,一直在找返回值类型的问题,怎么看都是没有问题的又改为如下,结果还是不对,查询资料反反复复还是出现这个异常突然一下想到会不会是有重复id名字的sql 我用的是idea,直接全局查询,确实查到了一模一样在别的包下的sql,因为我项目是maven的子工程,就给冲突了;最后还是冒着尝试想法去试了一下,把名字一个,哦吼!美滋滋 问题解决 不在报错以后开发还是需要多注意名字重复的问题的!…

  • 进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

    进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」一、实验目的和要求1.了解进程调度算法的特点2.掌握进程调度算法,如先来先服务调度算法(firstcomefirstserved,FCFS)、短作业优先调度算法(shotjobfirst,SJF)、时间片轮转调度算法。二、实验内容设计模拟实现FCFS、SJF、时间片轮转调度算法的C语言程序1.FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行…

  • datagrip 2021.12.4 激活服务器【中文破解版】

    (datagrip 2021.12.4 激活服务器)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~3Y…

  • java debug调试怎么用?[通俗易懂]

    java debug调试怎么用?[通俗易懂]我的qq2038373094在做项目的时候,尤其是涉及多个页面的传值的时候,debug调试十分有用,可以迅速帮你找到错误的原因!用debug的好处:1.跟踪变量,可以查看变量的值的变化2.迅速找到错误的原因,节省时间,找错小帮手那么debug调试助手怎么用,用在什么地方?debug用在java程序上,.class文件上面不适合jsp页面,不适合镶嵌在jsp页面…

    2022年10月16日
  • jQuery美女幻灯相册轮播源代码

    体验效果:http://hovertree.com/texiao/jquery/本幻灯片包含小图列表和大图轮播,包含图片标题和详细介绍,详细介绍字数可以很多,每张图片包含链接,可以实现跳转HTML文件

    2021年12月21日

发表回复

您的电子邮箱地址不会被公开。

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