代理的.h文件

#import <Foundation/Foundation.h>
#import "GCDAsyncSocket.h"
typedef void(^SR_DidReadData)(NSDictionary* didReadData);
/*
*/
@interface SocketRequest : NSObject<GCDAsyncSocketDelegate>
@property(nonatomic,copy)SR_DidReadData sr_DidReadData;
@property(nonatomic,retain)NSDictionary* sr_WriteData;
/**
* 单例
*/
+(SocketRequest*)defaultSocket;
/**
* 发送链接请求
*/
-(void)sr_StartConnect_WriteData:(NSDictionary*)writeData
ReviceData:(SR_DidReadData)reviceData;

.m文件

#import "SocketRequest.h"
#import "Public.h"
NSString* BoolValue(BOOL value)
{
if (value)
{
return @"YES";
}
return @"NO";
}
@implementation SocketRequest
{
GCDAsyncSocket* socket;
}
/**
* 单例
*/
+(SocketRequest *)defaultSocket
{
//socket只会实例化一次
static SocketRequest* socket=nil;
//保证线程安全,defaultSocket只执行一次
static dispatch_once_t once;
dispatch_once(&once, ^
{
socket=[[SocketRequest alloc] init];
});
return socket;
}
/**
* 初始化
*/
-(instancetype)init
{
self=[super init];
if (self)
{
socket=[[GCDAsyncSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, )];
}
return self;
}
/**
* 发送链接请求
*/
-(void)sr_StartConnect_WriteData:(NSDictionary*)writeData
ReviceData:(SR_DidReadData)reviceData
{
//先确定断开连接再开始链接
FunctionLog(@"%@",BoolValue(socket.isConnected));
if (socket.isConnected)
{
[socket disconnect];
}
self.sr_WriteData=writeData;
self.sr_DidReadData = reviceData;
NSError* error;
/*
判断不准(目标地址未开判断为YES)
*/
[socket connectToHost:SocketHost
onPort:SocketPort
error:&error];
if (!socket.isConnected)
{
if (self.sr_DidReadData)
{
self.sr_DidReadData(nil);
}
}
}
#pragma mark - <GCDAsyncSocketDelegate>
/**
* 发送数据成功
*/
-(void)socket:(GCDAsyncSocket *)sock
didWriteDataWithTag:(long)tag
{
FunctionLog(@"socket_Success");
}
/**
* 已经获取到数据
*/
-(void)socket:(GCDAsyncSocket *)sock
didReadData:(NSData *)data
withTag:(long)tag
{
NSError* error=nil;
id json=[NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&error];
if (error)
{
FunctionLog(@"%@",error.localizedDescription);
}
else
{
if ([NSJSONSerialization isValidJSONObject:json])
{
FunctionLog(@"%@",json);
if (self.sr_DidReadData)
{
self.sr_DidReadData(json);
}
}
}
[sock disconnect];
}
/**
* 链接出错
*/
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock
withError:(NSError *)err
{
if (err)
{
FunctionLog(@"%@",err.localizedDescription);
if (self.sr_DidReadData)
{
self.sr_DidReadData(nil);
}
}
}
/**
* 链接成功
*/
-(void)socket:(GCDAsyncSocket *)sock
didConnectToHost:(NSString *)host
port:(uint16_t)port
{
if ([NSJSONSerialization isValidJSONObject:self.sr_WriteData])
{
NSError* error;
//先转nsdata再转nsstring是为了保证nsdictionary格式不变
NSData *nsDataUser= [NSJSONSerialization dataWithJSONObject:self.sr_WriteData
options:NSJSONWritingPrettyPrinted
error:&error];
NSString* json=[[NSString alloc] initWithData:nsDataUser
encoding:NSUTF8StringEncoding];
json=[json stringByReplacingOccurrencesOfString:@"\n"
withString:@""];
json=[json stringByReplacingOccurrencesOfString:@" "
withString:@""];
json=[json stringByAppendingString:@"\n"];
/*
数据发送
*/
[sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding]
withTimeout:
tag:];
/*
数据读取
*/
[sock readDataWithTimeout:
tag:];
if (error)
{
FunctionLog(@"%@",error.localizedDescription);
}
}
}
@end
 //nsstring上传需要加"\n"分隔符方可上传成功
/*
[sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding]
withTimeout:-1
tag:0];
*/

使用


[[SocketRequest defaultSocket] sr_StartConnect_WriteData:@{}
ReviceData:^(NSDictionary *didReadData)
{}];

最新文章

  1. SubSonic3.0插件分页查询速度测试
  2. 手机APP创建桌面快捷方式
  3. Ctrl+Scroll改变所有Editor的缩放比例 (Code::Blocks)
  4. easyui treegrid 分页
  5. 消息队列系列(一):.Net平台下的消息队列介绍
  6. JS截取后缀名,文件全名,非后缀名的方法---收藏(冷饭_)
  7. 图论(二分图最大权独立点集):COGS 2051. 王者之剑
  8. NET基础课--代码安全
  9. JQeury Image LazyLoad
  10. poj2349,最小生成树!
  11. Fedora 19: How to resize/extend (LVM) partition?
  12. 大数据学习之hdfs集群安装部署04
  13. 【iOS开发】Alamofire框架的使用一基本用法
  14. (二)Knockout 文本与外观绑定
  15. 使用Filter过滤器+重写Request完美解决乱码问题
  16. zxing二维码的生成与解码(C#)
  17. BZOJ3207花神的嘲讽计划Ⅰ——主席树+hash
  18. killall 、kill 、pkill 命令详解 【转】
  19. ES6新特性三: Generator(生成器)函数详解
  20. unity中实现三个Logo图片进行若隐若现的切换并有延时切换图片的效果

热门文章

  1. [转]js 判断图片存在
  2. spring4 使用websocket
  3. 转-Shell笔记——命令:Sort,uniq,join,cut,paste,split
  4. C# 十进制与二进制、十六进制、八进制之间的转换
  5. 零度4W1H提问规则
  6. pdf word excel ppt 在线预览方案收集
  7. vue学习第四天 ------ 临时笔记
  8. easyui datagrid 动态加载数据 渲染问题,表格错位问题
  9. easyui datagrid 表格中操作栏 按钮图标不显示
  10. 【起航计划 015】2015 起航计划 Android APIDemo的魔鬼步伐 14 App-&gt;Activity-&gt;Translucent Blur 模糊背景