热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

iOS使用GCDSocketManager实现长连接的方法

下面想就为大家分享一篇iOS使用GCDSocketManager实现长连接的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

.h文件

#import 
#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()
//握手次数
@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

以上这篇iOS使用GCDSocketManager实现长连接的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文探讨了在 Vue 2.0 项目中使用 Axios 获取数据时可能出现的错误,并提供详细的解决方案和最佳实践。 ... [详细]
  • 本文探讨了在UC浏览器中调用分享面板后,图片无法正常显示的问题,并提供了详细的解决方法和代码示例。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 本文介绍如何在PostgreSQL数据库中正确插入和处理JSON数据类型,确保数据完整性和避免常见错误。 ... [详细]
  • 作为一名 Ember.js 新手,了解如何在路由和模型中正确加载 JSON 数据是至关重要的。本文将探讨两者之间的差异,并提供实用的建议。 ... [详细]
author-avatar
洪锐林
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有