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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 设置Windows系统自动登录

    设置Windows系统自动登录

    2021年8月17日
    46
  • map的containsKey方法

    map的containsKey方法map是一个key和value的键值对集合。map中的containKey(key)方法是判断该key在map中是否有key存在。如果存在则返回true,反之,返回false。程序实例:判断数组中是否有1,有的话就返回1和1所在的位置。我采用的是hashmap,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),时间消耗是很少的。packageTT04;importjava.util.Has…

    2022年6月23日
    103
  • 高通搜网流程_搜艺贝流程

    高通搜网流程_搜艺贝流程这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入https:…

    2022年10月7日
    3
  • Openssl Heartbleed

    Openssl Heartbleed近日闹的沸沸扬扬的Heartbleed漏洞,仿佛一下子再次将人们拉回了对网络安全的关注和担忧。这个问题就是由于服务器端没有对用户发过来的心跳包数据进行边界检查,服务端根据用户心跳包指定的数据长度来返回同样长度的数据。如果用户指定长度为100字节,而实际心跳数据的长度只有1字节,服务端还是会memcpy长度100字节的数据,这样就会把服务端内存中的数据返回给用户,可能会…

    2022年7月15日
    15
  • mac navicate激活码【2021免费激活】

    (mac navicate激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html41MD9IQHZL-eyJsa…

    2022年3月30日
    146
  • 腾讯群关系数据泄漏下载什么软件_云和数据/和华为之间的关系

    腾讯群关系数据泄漏下载什么软件_云和数据/和华为之间的关系腾讯群关系数据泄漏(可根据QQ号获得该人姓名经历等详细信息),外界已经有下载地址了,迅雷上就可以看到很多用户数据泄漏,可能是早期的漏洞被利用抓取的,可以根据QQ查一个人的姓名,年龄,关系网甚至从业经历等等

    2022年9月1日
    3

发表回复

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

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