iOS使用GCDSocketManager实现长连接
.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实现长连接相关推荐
- iOS中网络编程长连接
1.长连接在iOS开发中的应用 常见的短连接应用场景: 一般的App的网络请求都是基于 Http1.0 进行的,使用的是 NSURLConnection.NSURLSession 或者是 AFNetw ...
- 知乎技术分享:知乎千万级并发的高性能长连接网关技术实践
本文来自知乎官方技术团队的"知乎技术专栏",感谢原作者faceair的无私分享. 1.引言 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你 ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
转自即时通讯网:http://www.52im.net/ 本文原作者:"水晶虾饺",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说" ...
- ios http长连接_Nginx篇05——http长连接和keeplive
nginx中http模块使用http长连接的相关配置(主要是keepalive指令)和http长连接的原理解释. 1.http长连接 1.1 预备知识 连接管理是一个 HTTP 的关键话题:打开和保持 ...
- HTTP长连接和短连接以及推送服务原理(转)
HTTP长连接和短连接以及推送服务原理 转自:http://blog.csdn.net/freewaywalker/article/details/50067757 HTTP长连接和短连接1 1. H ...
- HTTP长连接和短连接 + Websocket
HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,T ...
- 转 互联网推送服务原理:长连接+心跳机制(MQTT协议)
http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 目录(?)[-] 无线移动网络的特点 android系统的推送和IOS的推送有什么 ...
- mqtt如何发送心跳 安卓_互联网推送服务原理:长连接+心跳机制(MQTT协议)
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...
- Netty 实现长连接服务的难点和优化点
推送服务 还记得一年半前,做的一个项目需要用到 Android 推送服务.和 iOS 不同,Android 生态中没有统一的推送服务.Google 虽然有 Google Cloud Messaging ...
最新文章
- php js实现异步图片上传,使用php+js异步上传图片
- sqlserver 标准系统数据库
- 疯狂ios讲义疯狂连载之日期选择器(UIDatePicker)
- 【CyberSecurityLearning 32】Apache配置、Apache的访问控制设定、LAMP平台的搭建
- can 总线通信协议开发_Simulink应用层开发—CAN总线信号处理
- stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程
- 基于流程管理,提高工作质量和效率
- layui,返回的数据不符合规范,正确的成功状态码 (code) 应为:0
- 通过Kali linux 模拟CC攻击进行WEB压力测试实战
- 某企业ERP实施WBS分解
- postman 接口测试用例设计
- Android2018年最新前沿框架和技术
- 电脑版微信多开小技巧
- TWaver三维可视化管理软件、3D和2D开发工具软件的试用(申请试用的回复邮件)
- win7虚拟计算机名,电脑高手必会技能:VMware虚拟机安装win7教程
- RAM与ROM的区别
- 对话上海财经大学ITCS主任陆品燕教授:如何用一年时间,建设国际一流理论计算机研究中心?...
- 响铃:2018博鳌金融科技亮点 这些关键词你搞懂了几个
- 指定文件名无效或太长,请指定另一文件名
- IDEA导入外部Module步骤
热门文章
- nginx完全卸载删除
- pid温度控制c语言程序及仿真,pid算法温度控制c语言程序
- 如何安装Dev-C++(Dev-C++软件下载及安装教程)
- C++实现九九乘法 (by yzs-device)
- SEO技巧:Meta标签详解
- 进程间通信有哪几种方式?进程间通信的方法详解
- 硬件基础:MOS管工作区间及开通过程分析——以N沟道增强型MOS为例
- jQuery插件开发全解析,jQuery.extend , (function($){ , $.fn.pluginName
- 关于使用腾讯云HiFlow场景连接器每天提醒签到打卡
- 数组双指针和数组窗口