CocoaAsyncSocket使用

代理的.h文件

//GCDAsyncSocketDelegate执行代理对象#import <Foundation/Foundation.h>
#import "CocoaAsyncSocket.h"typedef void(^DidReadData)(NSDictionary* didReadData);
/***  GCDAsyncSocketDelegate执行代理对象*/
@interface NSObjectGCDAsyncSocket : NSObject<GCDAsyncSocketDelegate>
/***  接收到数据的处理*/
@property(nonatomic,copy)DidReadData didReadData;
/***  发送的数据  如果添加新键值则需要先开辟内存*/
@property(nonatomic,retain)NSMutableDictionary* writeData;
/***  发送链接请求*/
-(BOOL)startConnect;
/***  单例*/
+(NSObjectGCDAsyncSocket*)defaultSocket;@end

.m文件

//
//  NSObjectGCDAsyncSocket.m
//  attendance#import "NSObjectGCDAsyncSocket.h"@implementation NSObjectGCDAsyncSocket
{GCDAsyncSocket* socket;
}
/***  单例**  @return*/
+(NSObjectGCDAsyncSocket *)defaultSocket
{// socket只会实例化一次static NSObjectGCDAsyncSocket* socket=nil; // 保证线程安全,defaultSocket只执行一次static dispatch_once_t once;dispatch_once(&once, ^{socket=[[NSObjectGCDAsyncSocket alloc] init];});return socket;
}/***  初始化***  @return self*/
-(instancetype)init
{self=[super init];if (self){socket=[[GCDAsyncSocket alloc] initWithDelegate:selfdelegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];}return self;
}
/***  发送链接请求*/
-(BOOL)startConnect
{// 先确定断开连接再开始链接if (socket.isConnected){NSLog(@"主动断开");[socket disconnect];}NSError* error;BOOL  isSuccess= [socket connectToHost:SocketHostonPort:SocketPorterror:&error];if (error){NSLog(@"error.localizedDescription:%@",error.localizedDescription);}return isSuccess;}
#pragma mark - GCDAsyncSocketDelegate
/***  链接成功**  @param sock sock实例*  @param host IP*  @param port 端口*/
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)hostport:(uint16_t)port
{//    NSLog(@"%s",__FUNCTION__);
//    NSLog(sock.isConnected?@"YES":@"NO");
//    if (sock.isConnected)
//    {// NSString上传需要加"\n"分隔符方可上传成功
/*[sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding]withTimeout:-1tag:0];*//*NSDictionary* nsDictionaryUser=@{@"gpsinfo":@"Gpsinfo",@"pswd":self.passWord,@"gpstype":@(2015),@"name":self.name,};NSDictionary* agrement=@{@"vertion":@(1),@"type1":@(2),@"type2":@(0),@"type3":@(0)};
*/if ([NSJSONSerialization isValidJSONObject:self.writeData]){
//            NSLog(@"isValidJSONObject");NSError* error;// 先转NSData再转NSString是为了保证NSDictionary格式不变NSData *nsDataUser= [NSJSONSerialization dataWithJSONObject:self.writeDataoptions:NSJSONWritingPrettyPrintederror:&error];NSString* json=[[NSString alloc] initWithData:nsDataUserencoding:NSUTF8StringEncoding];
//            NSLog(@"nsDictionaryUser:%@",json);json=[json stringByReplacingOccurrencesOfString:@"\n"withString:@""];json=[json stringByReplacingOccurrencesOfString:@" "withString:@""];json=[json stringByAppendingString:@"\n"];
//            NSLog(@"json:%@",json);[sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding]withTimeout:-1tag:0];// 保持读取的长连接[sock readDataWithTimeout:-1tag:0];if (error){NSLog(@"localizedDescription:%@",[error localizedDescription]);NSLog(@"localizedFailureReason:%@",[error localizedFailureReason]);}}//    }}
/***  发送数据成功**  @param sock  sock实例*  @param tag  标记sock*/
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
//    NSLog(@"didWriteDataWithTag");
}
/***  已经获取到数据**  @param sock sock实例*  @param data 获取到的数据*  @param tag  标记sock*/
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)datawithTag:(long)tag
{//    NSLog(@"%s",__FUNCTION__);NSError* error=nil;NSDictionary* json=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragmentserror:&error];NSLog([NSJSONSerialization isValidJSONObject:json]?@"is ValidJSONObject":@"is't ValidJSONObject");if (error){NSLog(@"socketError1:%@",[error localizedDescription]);NSLog(@"socketError2:%@",[error localizedFailureReason]);}self.didReadData(json);[sock disconnect];}/***  链接出错**  @param sock sock实例*  @param err  错误参数*/
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
//    NSLog(@"%s",__FUNCTION__);if (err){NSLog(@"socketDidDisconnect:%@",[err localizedDescription]);NSLog(@"socketDidDisconnect:%@",[err localizedFailureReason]);}
//    self.didReadData(nil);
}@end

使用

创建对象socket=[NSObjectGCDAsyncSocket defaultSocket];
填写发送的数据
socket.writeData=[NSMutableDictionary dictionaryWithDictionary:dictionary];
处理收到的数据socket.didReadData=^(NSDictionary* didReadData){.......}
开始链接
[socket startConnect];
添加CocoaAsyncSocket 第三库 链接地址:https://github.com/robbiehanson/CocoaAsyncSocket

转载自蝼蚁之毒

转载于:https://www.cnblogs.com/congli0220/p/4971182.html

iOS-----简易地CocoaAsyncSocket使用相关推荐

  1. ios 简书 获取通讯录信息_ios 各种权限整理

    联网权限 引入头文件 @import CoreTelephony; 应用启动后,检测应用中是否有联网权限 CTCellularData *cellularData = [[CTCellularData ...

  2. iOS开发之CocoaAsyncSocket使用

    本文介绍了CocoaAsyncSocket库中GCDAsyncSocket类的使用.粘包处理以及时间延迟测试. 一.CocoaAsyncSocket介绍 CocoaAsyncSocket中主要包含两个 ...

  3. ios 简书 获取通讯录信息_iOS 13获取用户通讯录需要注意的

    获取通讯录还有一个最大的变化,就是iOS9以后 访问通讯录属性,要事先设置好,否则会奔溃, 下面是列表 // 姓名前缀 CNContactNamePrefixKey // 名 CNContactGiv ...

  4. ios 简书 获取通讯录信息_当心!你用的共享充电宝可能被植入木马盗取信息

    出门在外,你的焦虑感是否会随着手机电量的降低而同步提高呢?乘车.支付.娱乐.联系都离不开手机,一旦没了电简直要丢掉半条命.这个时候遍布大街小巷的共享充电宝简直成了救命稻草.然而在你放心使用共享充电宝时 ...

  5. ios 简书 获取通讯录信息_iOS9以后获取手机通讯录

    一.iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人. AddressBook 框架:纯 C 语言的 API,仅 ...

  6. ios 简书 获取通讯录信息_iOS-授权获取通讯录

    - (void)getContact{ CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusF ...

  7. 简书iOS APP内测邀请

    简书iOS APP正在进行全新改版,新版本的功能涉及阅读文章/发表评论/订阅管理专题/社交动态/个人主页展示等.我们欢迎对简书新版iOS APP感兴趣的你参与我们的内测申请. 新版iOS简书的界面,是 ...

  8. 【原创】新手入门一篇就够:从零开发移动端IM

    一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...

  9. Facebook React完全解析

    Facebook React完全解析 2004年,对于前端社区来说,是里程碑式的一年.Gmail横空出世,它带来基于前端渲染的原生应用级别的体验,相对于之前的服务端渲染网页可谓提升了一个时代,触动了用 ...

最新文章

  1. 2017软件工程第一次作业
  2. 黑马程序员_Java面向对象_包
  3. Javascript实现的左右滑动菜单
  4. 拥抱开源!除了微软红帽,这些国际大厂你认识几个?
  5. 启动mysql55命令_mysql服务的启动和停止登陆mysql增加新用命令和方法实例教程
  6. mysql 断号查询_怎么查询SQL中连续编号中间的断号
  7. 有的浏览器可以直接打开rtsp,有的不能
  8. ucenter通信失败和不能登录的解决
  9. 计算机在网络通信方面的应用,分析计算机技术在通信中的应用
  10. Mastermind游戏
  11. nc63文件服务器,nc命令传输文件
  12. mt管理器主题修改教程_微信皮肤主题怎么弄 微信设置更换修改气泡和主题教程...
  13. 3dsnbsp;max基础材质初学者必读——陶瓷质感表现(11)
  14. Python爬取京东商品数据
  15. 10道不得不会的 Redis 面试题
  16. 生死狙击服务器维护什么意思,生死狙击更新维护公告
  17. ddos肉鸡都是哪来的?
  18. 一级造价工程师(安装)- 计量笔记 - 第一章第三节安装工程常用管件和附件
  19. 前端:request.js?b775:105 Uncaught (in promise) Error: nested exception is org.apache.ibatis.exceptions
  20. gta5组装电脑配置推荐2021适合玩gta5游戏电脑清单

热门文章

  1. java中什么是类型_什么是Java中基本数据类型?
  2. 租网站服务器安全吗,租用的服务器安全吗
  3. python 去空_Python 内存分配时的小秘密
  4. 计算机组成原lta,计算机组成原理实验三运算器
  5. Oracle怎么算开始一个会话,oracle – 随机获取ORA-08177只有一个活动会话
  6. android解析ip地址,android – 如何从IP地址解析网络主机名
  7. mysql 两列数据互换_mysql 实现互换表中两列数据方法简单实例
  8. java高并发(十七)J.U.C之BlockingQueue
  9. 开源 | App 开发神仙工具:帮你抓 Bug
  10. 如何看待 2020 届校招算法岗「爆炸」的情况?英雄所见略同