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:self
- delegateQueue: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:SocketHost
- onPort:SocketPort
- error:&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 *)host
- port:(uint16_t)port
- {
- // NSLog(@"%s",__FUNCTION__);
- // NSLog(sock.isConnected?@"YES":@"NO");
- // if (sock.isConnected)
- // {
- // NSString上传需要加"\n"分隔符方可上传成功
- /*
- [sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding]
- withTimeout:-1
- tag: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.writeData
- options:NSJSONWritingPrettyPrinted
- error:&error];
- NSString* json=[[NSString alloc] initWithData:nsDataUser
- encoding: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:-1
- tag:0];
- // 保持读取的长连接
- [sock readDataWithTimeout:-1
- tag: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 *)data
- withTag:(long)tag
- {
- // NSLog(@"%s",__FUNCTION__);
- NSError* error=nil;
- NSDictionary* json=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:data
- options:NSJSONReadingAllowFragments
- error:&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
iOS-----简易地CocoaAsyncSocket使用的更多相关文章
- iOS开发之CocoaAsyncSocket学习
本文转载至 http://blog.csdn.net/l_ch_g/article/details/17050757 AsyncSocket AsyncSocket类是支持TCP的AsyncUdpSo ...
- 【原创】新手入门一篇就够:从零开发移动端IM
一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...
- Facebook React完全解析
2004年,对于前端社区来说,是里程碑式的一年.Gmail横空出世,它带来基于前端渲染的原生应用级别的体验,相对于之前的服务端渲染网页可谓提升了一个时代,触动了用户的G点.自此,前端渲染的网站成为无数 ...
- 探索React生态圈
原文地址:http://www.csdn.net/article/2015-08-04/2825370-react 2004年,对于前端社区来说,是里程碑式的一年.Gmail横空出世,它带来基于前端渲 ...
- TCP|UDP|Http|Socket
TCP_IP.Http.Socket的区别 - 计算机网络知识库 iOS-Socket网络通信-框架与API - 简书 CocoaAsyncSocket + Protobuf 处理粘包和拆包问题 - ...
- 《IM开发新手入门一篇就够:从零开发移动端IM》
登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页 即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM 帖子 打赏 分享 发表评论162 想开 ...
- Mac使用最多的软件,整理集合
软件资源 #[PDF移除密码]Cisdem PDFPasswordRemover 3.0.0 [TNT] #Alfred_3.1.1_737 #fwmso2016vlu2.0 #iHosts #Omn ...
- fir.im Weekly - 揭秘直播移动 APP 技术实现
2016年直播似乎无处不在,作为一个开发者也许需要补充下关于直播技术点.本期 fir.im Weekly 整理了一些开发者对于直播实践项目中的技术经验与直播技术架构分析等内容,还有一些关于 iOS . ...
- Python - 搭建Jupyter notebook环境
1- Jupyter简介 HomePage:https://jupyter.org/ 安装指南:https://jupyter.org/install.html 官方文档:https://jupyte ...
随机推荐
- Spark Shuffle(三)Executor是如何fetch shuffle的数据文件(转载)
1. 前言 在前面的博客中讨论了Executor, Driver之间如何汇报Executor生成的Shuffle的数据文件,以及Executor获取到Shuffle的数据文件的分布,那么Executo ...
- PAT 1031 Hello World for U[一般]
1031 Hello World for U (20 分) Given any string of N (≥5) characters, you are asked to form the chara ...
- Lyft Level 5 Challenge 2018 - Elimination Round
A. King Escape 签. #include <bits/stdc++.h> using namespace std; ], y[]; int f1(int X, int Y) { ...
- laravel + html ajax 多表单字段和图片一起上传
$("#article_push").on('click', function (e){ e.preventDefault(); var stylestr = $('#summer ...
- Fms3和Flex打造在线多人视频会议和视频聊天(附原代码)
Flex,Fms3系列文章导航 Flex,Fms3相关文章索引 本篇是视频聊天,会议开发实例系列文章的第3篇,该系列所有文章链接如下: http://www.cnblogs.com/aierong/a ...
- inline用法详解
(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...
- 获取当前线程id
转:https://www.cnblogs.com/comsky/p/6020327.html 如果获得当前进程的Id用: Process[] processes = Process.GetProce ...
- ubuntu如何使zsh替换bash
答: 1.安装zsh sudo apt-get install zsh 2.zsh替换bash sudo chsh -s `which zsh` 3.重启 (注:重启后打开一个终端会自动进入zsh的 ...
- enum SQLiteDateFormats
DateTimeFormatInfo.CurrentInfo https://msdn.microsoft.com/en-us/library/system.globalization.datetim ...
- 往前端打smarty数据
$data['hot_issue']=$hotIssue; var_dump($data);