.h文件

#import <Foundation/Foundation.h>
#import "GCDAsyncSocket.h"@interface GCDSocketManager : NSObject@property(nonatomic,strong) GCDAsyncSocket *socket;//单例
+ (instancetype)sharedSocketManager;//连接
- (void)connectToServer;//断开
- (void)cutOffSocket;@end

.m文件

#import "GCDSocketManager.h"#define SocketHost @"地址"
#define SocketPort 端口@interface GCDSocketManager()<GCDAsyncSocketDelegate>//握手次数
@property(nonatomic,assign) NSInteger pushCount;//断开重连定时器
@property(nonatomic,strong) NSTimer *timer;//重连次数
@property(nonatomic,assign) NSInteger reconnectCount;@end@implementation GCDSocketManager//全局访问点
+ (instancetype)sharedSocketManager {static GCDSocketManager *_instance = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [[self alloc] init];});return _instance;
}//可以在这里做一些初始化操作
- (instancetype)init
{self = [super init];if (self) {}return self;
}#pragma mark 请求连接
//连接
- (void)connectToServer {self.pushCount = 0;self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];NSError *error = nil;[self.socket connectToHost:SocketHost onPort:SocketPort error:&error];if (error) {DLog(@"SocketConnectError:%@",error);}
}#pragma mark 连接成功
//连接成功的回调
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {DLog(@"socket连接成功");[self sendDataToServer];
}//连接成功后向服务器发送数据
- (void)sendDataToServer {//发送数据代码省略...//发送[self.socket writeData:jsonData withTimeout:-1 tag:1];//读取数据[self.socket readDataWithTimeout:-1 tag:200];
}//连接成功向服务器发送数据后,服务器会有响应
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {[self.socket readDataWithTimeout:-1 tag:200];//服务器推送次数self.pushCount++;//在这里进行校验操作,情况分为成功和失败两种,成功的操作一般都是拉取数据
}#pragma mark 连接失败
//连接失败的回调
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {DLog(@"Socket连接失败");self.pushCount = 0;NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];NSString *currentStatu = [userDefaults valueForKey:@"Statu"];//程序在前台才进行重连if ([currentStatu isEqualToString:@"foreground"]) {//重连次数self.reconnectCount++;//如果连接失败 累加1秒重新连接 减少服务器压力NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 * self.reconnectCount target:self selector:@selector(reconnectServer) userInfo:nil repeats:NO];self.timer = timer;}
}//如果连接失败,5秒后重新连接
- (void)reconnectServer {self.pushCount = 0;self.reconnectCount = 0;//连接失败重新连接NSError *error = nil;[self.socket connectToHost:SocketHost onPort:SocketPort error:&error];if (error) {DLog(@"SocektConnectError:%@",error);}
}#pragma mark 断开连接
//切断连接
- (void)cutOffSocket {DLog(@"socket断开连接");self.pushCount = 0;self.reconnectCount = 0;[self.timer invalidate];self.timer = nil;[self.socket disconnect];
}
@end

作者:huber链接:https://www.jianshu.com/p/60fd4ae4cd74來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

iOS使用GCDSocketManager实现长连接相关推荐

  1. iOS中网络编程长连接

    1.长连接在iOS开发中的应用 常见的短连接应用场景: 一般的App的网络请求都是基于 Http1.0 进行的,使用的是 NSURLConnection.NSURLSession 或者是 AFNetw ...

  2. 知乎技术分享:知乎千万级并发的高性能长连接网关技术实践

    本文来自知乎官方技术团队的"知乎技术专栏",感谢原作者faceair的无私分享. 1.引言 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你 ...

  3. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    转自即时通讯网:http://www.52im.net/ 本文原作者:"水晶虾饺",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说" ...

  4. ios http长连接_Nginx篇05——http长连接和keeplive

    nginx中http模块使用http长连接的相关配置(主要是keepalive指令)和http长连接的原理解释. 1.http长连接 1.1 预备知识 连接管理是一个 HTTP 的关键话题:打开和保持 ...

  5. HTTP长连接和短连接以及推送服务原理(转)

    HTTP长连接和短连接以及推送服务原理 转自:http://blog.csdn.net/freewaywalker/article/details/50067757 HTTP长连接和短连接1 1. H ...

  6. HTTP长连接和短连接 + Websocket

    HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,T ...

  7. 转 互联网推送服务原理:长连接+心跳机制(MQTT协议)

    http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 目录(?)[-] 无线移动网络的特点 android系统的推送和IOS的推送有什么 ...

  8. mqtt如何发送心跳 安卓_互联网推送服务原理:长连接+心跳机制(MQTT协议)

    互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...

  9. Netty 实现长连接服务的难点和优化点

    推送服务 还记得一年半前,做的一个项目需要用到 Android 推送服务.和 iOS 不同,Android 生态中没有统一的推送服务.Google 虽然有 Google Cloud Messaging ...

最新文章

  1. php js实现异步图片上传,使用php+js异步上传图片
  2. sqlserver 标准系统数据库
  3. 疯狂ios讲义疯狂连载之日期选择器(UIDatePicker)
  4. 【CyberSecurityLearning 32】Apache配置、Apache的访问控制设定、LAMP平台的搭建
  5. can 总线通信协议开发_Simulink应用层开发—CAN总线信号处理
  6. stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程
  7. 基于流程管理,提高工作质量和效率
  8. layui,返回的数据不符合规范,正确的成功状态码 (code) 应为:0
  9. 通过Kali linux 模拟CC攻击进行WEB压力测试实战
  10. 某企业ERP实施WBS分解
  11. postman 接口测试用例设计
  12. Android2018年最新前沿框架和技术
  13. 电脑版微信多开小技巧
  14. TWaver三维可视化管理软件、3D和2D开发工具软件的试用(申请试用的回复邮件)
  15. win7虚拟计算机名,电脑高手必会技能:VMware虚拟机安装win7教程
  16. RAM与ROM的区别
  17. 对话上海财经大学ITCS主任陆品燕教授:如何用一年时间,建设国际一流理论计算机研究中心?...
  18. 响铃:2018博鳌金融科技亮点 这些关键词你搞懂了几个
  19. 指定文件名无效或太长,请指定另一文件名
  20. IDEA导入外部Module步骤

热门文章

  1. nginx完全卸载删除
  2. pid温度控制c语言程序及仿真,pid算法温度控制c语言程序
  3. 如何安装Dev-C++(Dev-C++软件下载及安装教程)
  4. C++实现九九乘法 (by yzs-device)
  5. SEO技巧:Meta标签详解
  6. 进程间通信有哪几种方式?进程间通信的方法详解
  7. 硬件基础:MOS管工作区间及开通过程分析——以N沟道增强型MOS为例
  8. jQuery插件开发全解析,jQuery.extend , (function($){ , $.fn.pluginName
  9. 关于使用腾讯云HiFlow场景连接器每天提醒签到打卡
  10. 数组双指针和数组窗口