socket长连接 GCDAsyncSocket
基础: 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类的创建方法如下:
- [Socket sharedInstance].socketHost = @"wei.fm.hebrbtv.com";// host设定
- [Socket sharedInstance].socketPort = 9004;// port设定
- // 在连接前先进行手动断开
- [Socket sharedInstance].socket.userData = SocketOfflineByUser;
- [[Socket sharedInstance] cutOffSocket];
- // 确保断开后再连,如果对一个正处于连接状态的socket进行连接,会出现崩溃
- [[Socket sharedInstance] socketConnectHost:^{
- }];
- [Socket sharedInstance].socket.userData = SocketOfflineByServer;
使用时需要添加几个通知方法
- //接收新消息通知
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(insertMessage:) name:SocketNewMessageNotification object:nil];
- //socket断开通知
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(socketConnectError) name:SocketConnectErrorNotification object:nil];
- //socket连接通知
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(socketConnectSuccess) name:SocketConnectSuccessNotification object:nil];
一、说一下Socket类里面的具体实现方法
连接方法
GCDAsyncSocket创建时需要添加一个线程 这里使用主线程,开启成功后即开启了一个通道,也可以理解为一个水管,后台通过这个通道不定时的发送数据过来。
- // socket连接
- -(void)socketConnectHost:(VoidBlock)block
- {
- //数据处理类清楚历史数据
- [[DataControl shareControl] clearData];
- //回调方法
- _block = block;
- //连接socket
- self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
- NSError *error = nil;
- [self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:3 error:&error];
- }
连接成功后进行数据读取,开启心跳连接;之后会在GCDAsyncSocket的代理方法中获取后台发送的数据。
- /**
- 连接成功
- */
- -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
- {
- if (_block) {
- _block();
- }
- //读取socket中的数据
- [self readData];
- // 每隔30s像服务器发送心跳包
- _connectTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(longConnectToSocket) userInfo:nil repeats:YES];// 在longConnectToSocket方法中进行长连接需要向服务器发送的讯息
- [_connectTimer fire];
- }
心跳连接:
- // 心跳连接
- -(void)longConnectToSocket{
- // 根据服务器要求发送固定格式的数据,假设为指令@".",但是一般不会是这么简单的指令
- NSString *longConnect = @".\n";
- NSData *dataStream = [longConnect dataUsingEncoding:NSUTF8StringEncoding];
- [self writeData:dataStream];
- }
读取数据方法如下,这里加入了一个数据处理类,防止粘包现象,具体原理会在下面说明
- /**
- 收到服务器的数据,读取数据成功后通过SocketDataControl处理,防止粘包
- */
- -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
- {
- [self readData];
- NSLog(@"读取成功");
- __block NSMutableArray *arr = [NSMutableArray new];
- [[DataControl shareControl] appendingData:data newData:^(NSMutableArray *models) {
- [self performSelector:@selector(sendMessage:) withObject:models];
- arr = models;
- }];
- }
二、收处理模块:
三、断线重连模块
socket长连接 GCDAsyncSocket的更多相关文章
- 基于心跳的socket长连接
http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
- android端 socket长连接 架构
看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...
- 【Socket】关于socket长连接的心跳包
TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...
- 基于netty框架的socket长连接负载均衡解决方案
socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据 ...
- iOS后台如何保持socket长连接和数据传输
工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭 ...
- socket长连接理解
在一个tcp连接上可以连续发送多个数据包,在tcp连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 长连接指建立socket连接后不管是否使用都保持连接,但安全 ...
- 6.1 socket 长连接、短连接
一般情况下,服务器的长连接和短连接不是服务器说了算,而是客户端说了算.因为服务器是给别人提供业务的,一旦连接建立起来之后,服务器端不会主动把连接给close掉. 客户端发送一笔业务,没有关闭连接,然后 ...
- 使用http维持socket长连接
项目中有遇到问题如下: 1.旧版的cs服务,因为每个用户和唯一的长连接是在登录后绑定的,并且所有的消息报文均是基于该长连接去发送接收的,所以要求node服务要维持一个长连接,然后根据该用户获取长连接, ...
随机推荐
- Perl基础语法
一.脚本文件perl 代码可以写在一个文本文件中,以 .pl..PL 作为后缀.文件名可以包含数字,符号和字母,但不能包含空格,可以使用下划线(_)来替代空格.一个简单的Perl 文件名:rurun_ ...
- zookeeper伪集群的搭建
由于公司服务器数量的限制,我们往往没有那么多的服务器用来搭建zookeeper的集群,所以产生了伪集群的搭建,也就是将多个zookeeper搭建在同一台机器上. 准备工作: 1,一台服务器,我们这里用 ...
- 03.WSDL分析
自己做一个程序放到tomcat里面这个就是服务,自己安装一个oracle,oracle启动之后那它本身就是一种服务. WebService就是HTTP,那么它和HTTP有什么不同呢? HTTP GET ...
- memcache 加载(对象)所遇到的问题。资源
<?php $mem =new memcache(); if($mem->connect('127.0.0.1','11211')){ echo '连接OK'.'<br>'; ...
- c# 获取客户端ip、mac、机器名、操作系统、浏览器信息
d using System; using System.Collections.Generic; using System.Linq; using System.Web; using System. ...
- Linux PulseAudio
一.简介 Linux的声音系统或许是最无序的子系统部分!作为Server来说,声音无足轻重,无人问津,而作为桌面来说太多的实现方案,各有各的长出和不足,ALSA经过多年的发展,基本统一了Linux声卡 ...
- xgboost 调参 !
https://jessesw.com/XG-Boost/ http://blog.csdn.net/u010414589/article/details/51153310
- Windows7下使用sphinx生成开源文档(原)
作者这里以osgearth文档为例,感觉这种生成文档的方式比较好,生成的html文档是支持搜索的,感谢开源工作者的奉献.赞一个 1. 下载并安装python for windows:https://w ...
- idea无法下载源码(Cannot download sources)
有网上说,在命令行项目根目录下,执行如下命令下载: mvn dependency:resolve -Dclassifier=sources 我试着没有效果. 但是在本地仓库中,找到要下载的目录,删除以 ...
- 一张图看懂ASP.NET MVC5认证和授权过滤器的执行顺序
IAuthenticationFilter是MVC5中的新特性,它有2个关键方法: OnAuthentication OnAuthenticationChallenge 当IAuthenticatio ...