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


相关推荐

  • Git 当前项目设置 用户名、邮箱「建议收藏」

    Git 当前项目设置 用户名、邮箱「建议收藏」Git全局配置和单个仓库的用户名邮箱配置学习git的时候,大家刚开始使用之前都配置了一个全局的用户名和邮箱$gitconfig–globaluser.name“github’sName”$gitconfig–globaluser.email“github@xx.com”$gitconfig–list如果你公司的项目是放在自建的gitlab上面,如…

    2025年9月29日
    3
  • Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener「建议收藏」

    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener「建议收藏」 前言  本章内容是android.widget.CompoundButton.OnCheckedChangeListener,翻译来自德罗德,再次感谢德罗德!期待你一起参与AndroidAPI的中文翻译,联系我over140@gmail.com。 声明  欢迎转载,但请保留文章原始出处:)    博客园:http://www.cnblogs.com/    Android中文翻…

    2022年6月3日
    42
  • 关于驻点,拐点,极值点的关系_鞍点是拐点吗

    关于驻点,拐点,极值点的关系_鞍点是拐点吗  最近有些考研的小伙伴问到我这个问题,正好也给自己梳理一下思路,毕竟在机器学习里面这4个概念也是非常重要的,不过这里由于知识所限,就只整理跟考研部分比较相关的知识点了。  既然是4种点,首先就需要将其进行大致的分类,大致来说如下。$$\begin{cases}一元函数\quad\begin{cases}一阶导数f'(x)\quad驻点、极值点、鞍点\\[3…

    2025年7月28日
    5
  • 热插拔——矿机先行利器[通俗易懂]

    热插拔——矿机先行利器[通俗易懂]IPFSFilecoin上线在即,准备挖矿的小伙伴们已近磨刀霍霍了,都在积极选择自己心仪的矿机。但是如今市场上矿机众多,对于矿机的配置也是众说纷纭,相信许多的小伙伴也是十分茫然,当然,星际魔方今天只谈专业IPFS矿机,家用电脑组装的矿机我们后期再谈。工欲善其事,必先利其器。Fliecoin挖矿就是一种优质资源竞争的行为。形象理解就类似于嘀嘀打车,一个人想去另一个地方,在滴滴下单,司机开始抢单…

    2025年11月10日
    7
  • Ubuntu 更换国内源[通俗易懂]

    Ubuntu 更换国内源[通俗易懂]Ubuntu系统自带的源都是国外的网址,国内用户在使用的时候网速比较慢。一个软件的下载是十分痛苦的,这里讲解一下如何将国外源更换为国内源,让你的网速Biu.Biu.Biu1.备份原来的源sudocp/etc/apt/sources.list/etc/apt/sources_init.list将以前的源备份一下,以防以后可以用的。2.更换源sudogedi…

    2022年5月4日
    42
  • 史蒂芬周博客地址[通俗易懂]

    史蒂芬周博客地址[通俗易懂]http://www.sdifen.com/

    2022年8月5日
    9

发表回复

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

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