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

 

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

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

类名 Socket.h

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

类名DataContro.h

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

类名ReconnectControl.h

 

Socket类的创建方法如下:

 

 

[objc] view plain copy


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

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

 

 

[objc] view plain copy

 

1. //接收新消息通知  
2. [[NSNotificationCenterself@selector(insertMessage:):nil];  
3. //socket断开通知  
4. [[NSNotificationCenterself@selector(socketConnectError):nil];  
5. //socket连接通知  
6. [[NSNotificationCenterself@selector(socketConnectSuccess):nil];

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

 

连接方法

 

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

 

 

 

[objc] view plain copy

1. // socket连接  
2. -(void)socketConnectHost:(VoidBlock)block  
3. {  
4. //数据处理类清楚历史数据  
5.  clearData];  
6. //回调方法  
7.     _block = block;  
8. //连接socket  
9. self.socket = [[GCDAsyncSocketself delegateQueue:dispatch_get_main_queue()];  
10. NSError *error = nil;  
11. self.socketself.socketHostself.socketPort3 error:&error];  
12. }

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

 

 

[objc] view plain copy

1. /** 
2.  连接成功 
3.  */  
4. -(void)socket:(GCDAsyncSocket *)sockNSString *)host16_t)port  
5. {  
6. if (_block) {  
7.         _block();  
8.     }  
9. //读取socket中的数据  
10. self readData];  
11. // 每隔30s像服务器发送心跳包  
12. 30self@selector(longConnectToSocket):nilYES];// 在longConnectToSocket方法中进行长连接需要向服务器发送的讯息  
13.  fire];  
14. }

心跳连接:

 

 

[objc] view plain copy

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

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

 

 

[objc] view plain copy

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