基础: http://www.2cto.com/kf/201609/546974.html

转自: http://blog.csdn.net/u013282507/article/details/52621434

本篇文章的例子主要实现通过socket实时接收数据的一个图文直播的功能模块,代码为socket工具类。利用的工具是GCDAsyncSocket;

工具类主要有三个功能模块:

一、建立Socket连接,实现心跳连接,实现通过socket接收数据。

类名 Socket.h

二、数据处理模块,处理接收到的数据,避免粘包问题。

类名DataContro.h

三、断线重连模块,当socket断开时,重新启动一个新的socket请求,定时请求服务器,当连接成功时通知当前socket重新连接。

类名ReconnectControl.h

Socket类的创建方法如下:

  1. [Socket sharedInstance].socketHost = @"wei.fm.hebrbtv.com";// host设定
  2. [Socket sharedInstance].socketPort = 9004;// port设定
  3. // 在连接前先进行手动断开
  4. [Socket sharedInstance].socket.userData = SocketOfflineByUser;
  5. [[Socket sharedInstance] cutOffSocket];
  6. // 确保断开后再连,如果对一个正处于连接状态的socket进行连接,会出现崩溃
  7. [[Socket sharedInstance] socketConnectHost:^{
  8. }];
  9. [Socket sharedInstance].socket.userData = SocketOfflineByServer;

使用时需要添加几个通知方法

  1. //接收新消息通知
  2. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(insertMessage:) name:SocketNewMessageNotification object:nil];
  3. //socket断开通知
  4. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(socketConnectError) name:SocketConnectErrorNotification object:nil];
  5. //socket连接通知
  6. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(socketConnectSuccess) name:SocketConnectSuccessNotification object:nil];

一、说一下Socket类里面的具体实现方法

连接方法

GCDAsyncSocket创建时需要添加一个线程 这里使用主线程,开启成功后即开启了一个通道,也可以理解为一个水管,后台通过这个通道不定时的发送数据过来。

  1. // socket连接
  2. -(void)socketConnectHost:(VoidBlock)block
  3. {
  4. //数据处理类清楚历史数据
  5. [[DataControl shareControl] clearData];
  6. //回调方法
  7. _block = block;
  8. //连接socket
  9. self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
  10. NSError *error = nil;
  11. [self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:3 error:&error];
  12. }

连接成功后进行数据读取,开启心跳连接;之后会在GCDAsyncSocket的代理方法中获取后台发送的数据。

  1. /**
  2. 连接成功
  3. */
  4. -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
  5. {
  6. if (_block) {
  7. _block();
  8. }
  9. //读取socket中的数据
  10. [self readData];
  11. // 每隔30s像服务器发送心跳包
  12. _connectTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(longConnectToSocket) userInfo:nil repeats:YES];// 在longConnectToSocket方法中进行长连接需要向服务器发送的讯息
  13. [_connectTimer fire];
  14. }

心跳连接:

  1. // 心跳连接
  2. -(void)longConnectToSocket{
  3. // 根据服务器要求发送固定格式的数据,假设为指令@".",但是一般不会是这么简单的指令
  4. NSString *longConnect = @".\n";
  5. NSData   *dataStream  = [longConnect dataUsingEncoding:NSUTF8StringEncoding];
  6. [self writeData:dataStream];
  7. }

读取数据方法如下,这里加入了一个数据处理类,防止粘包现象,具体原理会在下面说明

  1. /**
  2. 收到服务器的数据,读取数据成功后通过SocketDataControl处理,防止粘包
  3. */
  4. -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
  5. {
  6. [self readData];
  7. NSLog(@"读取成功");
  8. __block NSMutableArray *arr = [NSMutableArray new];
  9. [[DataControl shareControl] appendingData:data newData:^(NSMutableArray *models) {
  10. [self performSelector:@selector(sendMessage:) withObject:models];
  11. arr = models;
  12. }];
  13. }

二、收处理模块:

  处理Socket数据粘包问题

三、断线重连模块

  Socket 断线重连问题

socket长连接 GCDAsyncSocket的更多相关文章

  1. 基于心跳的socket长连接

    http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...

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

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

  3. android端 socket长连接 架构

    看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...

  4. 【Socket】关于socket长连接的心跳包

    TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...

  5. 基于netty框架的socket长连接负载均衡解决方案

    socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据 ...

  6. iOS后台如何保持socket长连接和数据传输

    工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭 ...

  7. socket长连接理解

    在一个tcp连接上可以连续发送多个数据包,在tcp连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 长连接指建立socket连接后不管是否使用都保持连接,但安全 ...

  8. 6.1 socket 长连接、短连接

    一般情况下,服务器的长连接和短连接不是服务器说了算,而是客户端说了算.因为服务器是给别人提供业务的,一旦连接建立起来之后,服务器端不会主动把连接给close掉. 客户端发送一笔业务,没有关闭连接,然后 ...

  9. 使用http维持socket长连接

    项目中有遇到问题如下: 1.旧版的cs服务,因为每个用户和唯一的长连接是在登录后绑定的,并且所有的消息报文均是基于该长连接去发送接收的,所以要求node服务要维持一个长连接,然后根据该用户获取长连接, ...

随机推荐

  1. 关于项目报错Dynamic Web Module 3.0 requires Java 1.6 or newer 的解决方法

    起因:今天使用maven创建web项目的时候发现项目上老是有个红X,错误如下图所示,虽然项目能正常运行起来,但是LZ的强迫症发作,不弄掉就觉得心里不舒服,于是上网查了攻略,几经周折最终大功告成,现在就 ...

  2. consul watch

    consul watch -type key -key mhc ./key_handler.py [root@mhc consul]# cat key_handler.py #!/usr/bin/py ...

  3. nohup 无发后台运行

      用nohup命令让Linux下程序永远在后台执行 [ 2006-5-13 22:31:54 | By: 牧云 ]   Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在 ...

  4. 数据预处理:PCA,SVD,whitening,normalization

    数据预处理是为了让算法有更好的表现,whitening.PCA.SVD都是预处理的方式: whitening的目标是让特征向量中的特征之间不相关,PCA的目标是降低特征向量的维度,SVD的目标是提高稀 ...

  5. 修改Tomcat可支持get传参方式的url长度,get形式

    maxHttpHeaderSize="8192"加在 <Connector port="8081" maxHttpHeaderSize="314 ...

  6. 2014蓝桥杯B组初赛试题《啤酒和饮料》

    题目描述: 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元.     我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒.     注意:答案是一个整数.请通过 ...

  7. dubbo参数调优

    dubbo中配置优先级规律:方法级配置优先级高于接口级,consumer的优先级高于provider. 详细: consumer的method配置  >  provider的method配置 c ...

  8. Hibernate-Criteria

    Hibernate Criteria简介 一.Criteria接口的用途: 设计上可以灵活的根据criteria的特点进行查询条件的组装. CriteriaSpecification 接口是 Crit ...

  9. Luogu 3665 [USACO17OPEN]Switch Grass 切换牧草

    BZOJ 4777 被权限了. 这道题的做法看上去不难,但是感觉自己yy不出来. 首先是两个结论: 1.答案一定是连接着两个异色点的一条边. 2.答案一定在最小生成树上. 感觉看到了之后都比较显然,自 ...

  10. osm2pgsql导入少字段

    Explanation: osm2pgsql imports normally the data in a static database schema. The tags without a cor ...