CocoaAsyncSocket

iOS高级理论:CocoaAsyncSocket 介绍与使用 CocoaAsyncSocket为Mac和iOS提供了易于使用和功能强大的异步套接字库,主要包含两个类:GCDAsyncSocket:用GCD搭建的基于TCP/IP协议的socket网络库GCDAsyncUdpSocket:用GCD搭建的基于UDP/IP协议的socket网络库.本文主要介绍 GCDAsyncSocket的使用,他是一个TCP库,建在Grand Central Dispatch上面的。TCP是面向连接的,面向流的,提供高可靠性服务。 阅读详情

这个第三方库做了一些底层的封装,让我们在使用的时候可以去关心上层的东西,socket通信就是主机端口,和服务器端口建立连接,进行数据传输,因此整个过程就是服务端持续不断的监听,手机端发送连接请求,服务端接收到连接请求后返回接收到连接请求,再根据业务需求进行进一步通信。

1.一开始我认为socket连接只要做一套tcp的就行,其实是既有基于tcp也有基于udp的,tcp需要经过握手才能连接,udp则可以直接连接。

2.公司的业务需求包含wifi信息的验证,当处于局域网下,路由设备会处于监听状态,当接收到手机端发出的请求连接后会根据设备信息选择回复消息。

3.本义上我认为连接到公司特定的wifi下,那么只需要判断wifi的mac地址即bssid信息就能够判断是否为公司的路由器了,但是存在母路由器连接子路由器这种连接方式,极端情况下母路由和子路由的设备来自不同的厂家,wifi由公司母路由提供,其他品牌的子路由仅仅作为无线ap(hub)存在,这种情况下手机连接到子路由的情况下,依旧是可以控制母路由的,但mac地址自然不是公司提供的,因此不能作为判断是否连接到公司wifi的依据。

4.这种情况的解决只能是与路由器设定协议,路由和手机建立了socket连接,当路由器接收到手机端的请求,就会回复路由器的相关信息,可以返回是否为公司设备最好,如果没有,可以沟通要求返回的信息需要包含路由的mac地址,这样可以再次对比手机端获取的wifi mac地址,如果比对不一致,当然就认为非公司设备。

5.需要特别注意一点,就是路由设备有可能有多台都处于同一局域网下,这时候多台设备都接收到了手机端发起的连接请求,这时候多台设备都会回复信息给手机端,需要对不同的设备进行判断,应该需要添加一些双向验证的机制,来区分设备,从而来控制不同设备的不同需求。

6.重新进行讨论了一下,是这样的流程,手机端向局域网发送连接请求,然后监听组播网段内的回复信息,
公司特定的设备都是会在特定网段的范围内的,
当消息进行回复的时候,
比对bssid和回复的mac地址,一致的选择作为当前连接设备,另外一台设备会添加到设备列表中,当用户切换设备的时候,会进行重新建立UDP-到TCPsocket连接的过程。

7.接下来是对CocoaAsyncsocket的理解。
参考文章:iOS 基于GCDAsyncSocket快速开发Socket通信

根据这个写的UML图
点击查看

注意点:
有人提问说在网络环境以及其他因素下,很有可能会造成客户端或者后端没有接收到回调或者请求,那该怎么办呢?

我们需要加上消息回执的处理

客户端发出请求的时候,可以将该请求放到存到数组里面,等到后端的相应回调,如果该请求超时,说明后端没有接收到我们的请求,我们可以将该请求重新发送

客户端接收请求的时候,后端将数据发给客户端,客户端需要增加回执处理,告诉后端,客户端接收到数据了,如果后端没接收到,也重新推一遍数据,客户端和后端双向保护解决丢失问题

然后需要注意处理socket会出现不断断开的情况。

接下来要处理socket的进入后台就断开连接,进入前台重新开始连接的情况。因为socket保持长期后台是不能通过苹果审核的,如果真有需要,以推送的方式实现。

socket的粘包。半包处理

消息=消息头+消息体。消息头用于描述消息本身的基本信息,消息体则为消息的具体内容
这里写图片描述

如上图所示,假如我们的一个消息是这么定义的

消息头 = msgId(4B)+version(2B)+len(4B),共占用10字节

消息体 = len中描述的16字节长

所以这条消息的长度就是 26字节

可以看到,要想知道一条完整数据的边界,关键就是消息头中的len字段

假如我们现在接收到的数据是这样的:
这里写图片描述

这个情况下即包含了粘包,也出现了半包的情况,三个数据包粘在了一起,最后一个数据包没有接收完全,出现了半包的情况,看看代码如何处理

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{ 
  while (_readBuf.length >= 10)//因为头部固定10个字节,数据长度至少要大于10个字节,我们才能得到完整的消息描述信息 
  { 
    NSData *head = [_readBuf subdataWithRange:NSMakeRange(0, 10)];//取得头部数据 
    NSData *lengthData = [head subdataWithRange:NSMakeRange(6, 4)];//取得长度数据 
    NSInteger length = [[[NSString alloc] initWithData:lengthData encoding:NSUTF8StringEncoding] integerValue];//得出内容长度 
    NSInteger complateDataLength = length + 10;//算出一个包完整的长度(内容长度+头长度) 
    if (_readBuf.length >= complateDataLength)//如果缓存中数据够一个整包的长度 
    { 
      NSData *data = [_readBuf subdataWithRange:NSMakeRange(0, complateDataLength)];//截取一个包的长度(处理粘包) 
      [self handleTcpResponseData:data];//处理包数据 
      //从缓存中截掉处理完的数据,继续循环 
      _readBuf = [NSMutableData dataWithData:[_readBuf subdataWithRange:NSMakeRange(complateDataLength, _readBuf.length - complateDataLength)]]; 
    } 
    else//如果缓存中的数据长度不够一个包的长度,则包不完整(处理半包,继续读取) 
    { 
      [_socket readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];//继续读取数据 
      return; 
    } 
  } 
  //缓存中数据都处理完了,继续读取新数据 
  [_socket readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];//继续读取数据 
}
iOS - 基于CocoaAsyncSocket搭建完整的IM体系大体思路详解 想要搭建一个完善 ,且自定义程度较高 , 又便于后期维修和修改的IM体系 , 采用环信或者融云等实际上是非常消耗精力和时间的 ,因为他们做得也不完善 . 目前咱们已知的通信协议大概有MQTT , XMPP等 .. 然而 , 通信协议是别人制定好的规则 , 想要不受约束 , 就需要自定义一套属于自己的通信协议 . 其实通信协议并不难 , 无非就是iOS端,安卓端,web端和服务器共同协商一套,大 阅读详情

相关推荐

MOSFET高频响应实战:如何用LTspice仿真内部电容效应(附模型文件)

本文深入解析MOSFET高频响应中的内部电容效应,通过LTspice仿真工具详细展示如何提取模型参数并优化高频特性。从栅极相关电容到结电容的物理本质,再到实战案例中的开关损耗分析和频率响应扫描,提供全面的设计优化方法,帮助工程师有效应对高速开关电路中的电容挑战。

weixin_33725722的博客 390

CocoaAsyncSocket 使用指南

**CocoaAsyncSocket** 是一个专为 macOS、iOS 和 tvOS 设计的异步套接字网络库。它以 Grand Central Dispatch(GCD)为基础,提供了面向对象的、易于使用的Objective-C接口,简化了TCP/IP和UDP/IP网络编程。无论是构建服务器端监听还是客户端连接,该库都能提供强大的功能,支持IPv4/IPv6双栈,并且内置TLS/SSL安全特性。...

gitblog_00665的博客 1270

deap数据集的情绪检测代码环境搭建与实现

deap数据数据集很大

f的博客 4157

CocoaAsyncSocket 编程

CocoaAsyncSocket文件目录结构如下所示: 可以看到整个文件分为GCD以及RunLoop两个部分。至于整个第三方框架的介绍这里就不多说了,网上有很多类似的资料,这里重点说几个需要注意的地方: (1)GCDAsyncSocket:Fully GCD based and Thread-Safe 这个类是线程安全的,利用这个对象我们可以方便的进行一些并发操作而不用担心

无奈何之愚者的专栏 820

PyTorch模型生产部署:ONNX/Triton导出与高可用架构实战

机器学习模型部署本质是训练环境与生产环境之间的运行时契约建立过程,涉及序列化协议、推理引擎兼容性、动态批处理及资源隔离等核心问题。ONNX凭借标准化算子集和跨框架支持,成为平衡兼容性、性能与可维护性的首选导出格式;Triton Inference Server则通过原生多框架支持、动态batching和热加载能力,显著提升GPU利用率与服务SLA保障水平。在金融风控、电商推荐等高要求场景中,基于ONNX+Triton+K8s的分层架构可稳定支撑千级QPS与毫秒级P95延迟,同时满足模型热更新、可观测性与版本

weixin_33857679的博客 447

CST微带贴片天线设计全流程:从S11优化到辐射方向图分析

微带贴片天线是现代无线通信设备中的关键部件,其设计依赖于电磁场理论与仿真软件的结合。理解天线的基本工作原理,如谐振频率、阻抗匹配和辐射机制,是进行有效设计的基础。通过电磁仿真,工程师可以精确预测天线性能,避免传统手工计算的误差。在工程实践中,CST Studio Suite作为行业标准的三维电磁仿真工具,能够高效处理复杂的边界条件与材料属性,帮助优化S11参数和辐射方向图。本文聚焦于2.4GHz Wi-Fi频段微带贴片天线的完整设计流程,详细解析了端口设置、网格划分等关键步骤,并针对常见的仿真失败问题提供了

weixin_30784501的博客 459

iOS即时通讯之CocoaAsyncSocket源码解析二

原文 前言 本文承接上文:iOS即时通讯之CocoaAsyncSocket源码解析一 上文我们提到了GCDAsyncSocket的初始化,以及最终connect之前的准备工作,包括一些错误检查;本机地址创建以及socket创建;服务端地址的创建;还有一些本机socket可选项的配置,例如禁止网络出错导致进程关闭的信号等。 上文讲到了本文方法八--创建Socket,其中有这么一行代码: ...

weixin_30552811的博客 492

YOLOv11改进策略【Neck】| PRCV 2023,SBA(Selective Boundary Aggregation):特征融合模块,描绘物体轮廓重新校准物体位置,解决边界模糊问题

SBA 模块在医疗图像分割中具有重要作用,其设计出发点是解决图像中物体边界模糊以及融合特征时的冗余和不一致问题。

Limiiiing的博客 1942

【OC】基于CocoaAsyncSocket创建的简单SocketDemo

效果图: IP:服务器端的地址 PORT: 端口,可以设置为任意一个 代码: 服务器端连接: int port = [_txf_PORT.stringValue intValue]; if (port < 0 || port > 65535) { [_txf_PORT setStringValue:@""]; port = 0; } N

三岁牧羊的博客 660

g2o&PCL 四阶多项式拟合

g2o&PCL 四阶多项式拟合

dayuhaitang1的博客 139

多智能体系统在AI物流优化中的实际应用案例

订单波峰波谷难应对(如双11订单量暴增300%);动态干扰难处理(如突发交通拥堵、客户临时改地址);全局优化难实现(单辆车最优≠整体最优)。本文聚焦“多智能体系统(MAS)”这一AI技术,讲解其如何通过“群体智能”破解物流调度难题,并结合实际案例展示落地效果。本文从“生活故事→核心概念→技术原理→实战案例→未来趋势”逐步展开,用“快递员团队协作送外卖”类比MAS运作,结合Python代码模拟任务分配,最后通过某物流企业的真实项目验证效果。

AIGC应用创新大全的博客 1630

使用CocoaAsyncSocket适配IPv6

处理近期很棘手的app因为IPv6的问题被苹果拒绝的问题,顺利审核通过

piratest的专栏 7153

【OCPP】ocpp1.6J协议框架说明

本文档的目的是为读者提供创建正确的可互操作 OCPP JSON 实现 (OCPP-J) 所需的信息。我们将根据我们自己的经验,尝试解释什么是强制性的、什么是良好做法以及什么是不应该做的。毫无疑问,误解或歧义仍然存在,但我们旨在通过本文件尽可能地防止它们。IANA:互联网数字分配机构(OCPP-J:使用JSON通过WebSocket进行OCPP通信。特定的OCPP版本应使用J扩展进行指示。OCPP1.5J表示我们正在讨论1.5版本的JSON/WebSocket实现。

qq_53871375的博客 1238

iOS开发之CocoaAsyncSocket使用

本文介绍了CocoaAsyncSocket库中GCDAsyncSocket类的使用、粘包处理以及时间延迟测试.一.CocoaAsyncSocket介绍CocoaAsyncSocket中主要包含两个类:1.GCDAsyncSocket. 用GCD搭建的基于TCP/IP协议的socket网络库 GCDAsyncSocket is a TCP/IP socket networking libra

路漫漫其修远兮,吾将上下而求索. 1852

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【亲测免费】 CocoaAsyncSocket 常见问题解决方案

CocoaAsyncSocket 是一个用于 macOS、iOS 和 tvOS 的异步套接字网络库。它提供了易于使用且功能强大的异步套接字库,支持 TCP 和 UDP 协议。该项目主要使用 Objective-C 编写,但也支持 Swift 语言。 ## 新手使用注意事项及解决方案 ### 1. 依赖管理工具的选择 **问题描述:** 新手在集成 CocoaAsyncSocket 时,可能会...

gitblog_01027的博客 1331

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

超强网络库CocoaAsyncSocket:从安装到实战的完整指南

CocoaAsyncSocket是Mac和iOS平台上的异步Socket(套接字)网络库,提供TCP和UDP协议支持,基于Grand Central Dispatch(GCD)构建,具备高效、易用的特性。本文将从安装配置到实际应用,帮助开发者快速掌握这一强大工具。 ## 核心功能概览 CocoaAsyncSocket包含两个主要类,分别处理TCP和UDP协议: ### TCP通信:GCDAs...

gitblog_00870的博客 770

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

iOS —— CocoaAsyncSocket

CocoaAsyncSocket为macOS、iOS和tvOS提供了易于使用且功能强大的异步套接字库。他是基于C 语言Socket的一层封装,更加的面向对象。使得原生连接状态以及接受消息等函数都以代理的方式体现。使用性极高,极大提高开发效率。 CocoaAsyncSocket中主要包含两个类: GCDAsyncSocket.//基于TCP/IP协议的socket网络库 GCDAsyncUdp...

SHTLoveXX的专栏 538

CocoaAsyncSocket 通信

所有资源来自github swift socket资源 socketio/socket.io-client-swift swiftsocket/SwiftSocket AlwaysRightInstitute/SwiftSockets 由于各种问题,我不知道什么问题,反正各种问题...

chengqiwo1585的博客 319

CocoaAsyncSocket详解

CocoaAsyncSocket第三方库的存储地址是:https://github.com/robbiehanson/CocoaAsyncSocket CocoaAsyncSocket为Mac和iOS提高易于使用的、强大的异步套接字库。类的描述如下: TCP GCDAsyncSocket and AsyncSocket are TCP/IP socket netw

jie863230900的专栏 1255

CocoaAsyncSocket使用详解

CocoaAsyncSocket网络通信使用之tcp连接(一) 简述: 在互联网世界中,网络访问是必不可少的一部分,而对于程序员来说,网络编程却是一个比较复杂的存在,特别是socket处理方面。 在android平台中,java类库丰富,封装良好,比如:mina,netty等等。 而在ios平台中,也有出名的socket库,CocoaAsyncSocket。

LeonYin的专栏 1702

CocoaAsyncSocket集成教程:CocoaPods、Carthage与SPM全方案

CocoaAsyncSocket 是一款强大的异步socket网络库,专为macOS、iOS和tvOS平台设计。无论你是开发网络应用的新手还是经验丰富的开发者,这款库都能为你提供简单易用且功能丰富的TCP/UDP通信解决方案。本文将为你详细介绍三种主流的集成方式:CocoaPods、Carthage和Swift Package Manager。 ## 🚀 CocoaPods集成方案 Coco

gitblog_00877的博客 1035

【Swift】CocoaAsyncSocket-UDP

【代码】【Swift】CocoaAsyncSocket-UDP。

Yzzzzw01的博客 532

CocoaAsyncSocket源码解析

博客整理之CocoaAsyncSocket源码解析

Cedric's backpack 782
上一篇: 直连wifi的含义
下一篇: CocoaAsyncSocket (二)
csdn_Damon
博客等级 码龄10年 37粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值