iOS-----简易地CocoaAsyncSocket使用
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使用相关推荐
- ios 简书 获取通讯录信息_ios 各种权限整理
联网权限 引入头文件 @import CoreTelephony; 应用启动后,检测应用中是否有联网权限 CTCellularData *cellularData = [[CTCellularData ...
- iOS开发之CocoaAsyncSocket使用
本文介绍了CocoaAsyncSocket库中GCDAsyncSocket类的使用.粘包处理以及时间延迟测试. 一.CocoaAsyncSocket介绍 CocoaAsyncSocket中主要包含两个 ...
- ios 简书 获取通讯录信息_iOS 13获取用户通讯录需要注意的
获取通讯录还有一个最大的变化,就是iOS9以后 访问通讯录属性,要事先设置好,否则会奔溃, 下面是列表 // 姓名前缀 CNContactNamePrefixKey // 名 CNContactGiv ...
- ios 简书 获取通讯录信息_当心!你用的共享充电宝可能被植入木马盗取信息
出门在外,你的焦虑感是否会随着手机电量的降低而同步提高呢?乘车.支付.娱乐.联系都离不开手机,一旦没了电简直要丢掉半条命.这个时候遍布大街小巷的共享充电宝简直成了救命稻草.然而在你放心使用共享充电宝时 ...
- ios 简书 获取通讯录信息_iOS9以后获取手机通讯录
一.iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人. AddressBook 框架:纯 C 语言的 API,仅 ...
- ios 简书 获取通讯录信息_iOS-授权获取通讯录
- (void)getContact{ CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusF ...
- 简书iOS APP内测邀请
简书iOS APP正在进行全新改版,新版本的功能涉及阅读文章/发表评论/订阅管理专题/社交动态/个人主页展示等.我们欢迎对简书新版iOS APP感兴趣的你参与我们的内测申请. 新版iOS简书的界面,是 ...
- 【原创】新手入门一篇就够:从零开发移动端IM
一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...
- Facebook React完全解析
Facebook React完全解析 2004年,对于前端社区来说,是里程碑式的一年.Gmail横空出世,它带来基于前端渲染的原生应用级别的体验,相对于之前的服务端渲染网页可谓提升了一个时代,触动了用 ...
最新文章
- 2017软件工程第一次作业
- 黑马程序员_Java面向对象_包
- Javascript实现的左右滑动菜单
- 拥抱开源!除了微软红帽,这些国际大厂你认识几个?
- 启动mysql55命令_mysql服务的启动和停止登陆mysql增加新用命令和方法实例教程
- mysql 断号查询_怎么查询SQL中连续编号中间的断号
- 有的浏览器可以直接打开rtsp,有的不能
- ucenter通信失败和不能登录的解决
- 计算机在网络通信方面的应用,分析计算机技术在通信中的应用
- Mastermind游戏
- nc63文件服务器,nc命令传输文件
- mt管理器主题修改教程_微信皮肤主题怎么弄 微信设置更换修改气泡和主题教程...
- 3dsnbsp;max基础材质初学者必读——陶瓷质感表现(11)
- Python爬取京东商品数据
- 10道不得不会的 Redis 面试题
- 生死狙击服务器维护什么意思,生死狙击更新维护公告
- ddos肉鸡都是哪来的?
- 一级造价工程师(安装)- 计量笔记 - 第一章第三节安装工程常用管件和附件
- 前端:request.js?b775:105 Uncaught (in promise) Error: nested exception is org.apache.ibatis.exceptions
- gta5组装电脑配置推荐2021适合玩gta5游戏电脑清单
热门文章
- java中什么是类型_什么是Java中基本数据类型?
- 租网站服务器安全吗,租用的服务器安全吗
- python 去空_Python 内存分配时的小秘密
- 计算机组成原lta,计算机组成原理实验三运算器
- Oracle怎么算开始一个会话,oracle – 随机获取ORA-08177只有一个活动会话
- android解析ip地址,android – 如何从IP地址解析网络主机名
- mysql 两列数据互换_mysql 实现互换表中两列数据方法简单实例
- java高并发(十七)J.U.C之BlockingQueue
- 开源 | App 开发神仙工具:帮你抓 Bug
- 如何看待 2020 届校招算法岗「爆炸」的情况?英雄所见略同