CocoaAsyncSocket使用
代理的.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)
{}];
CocoaAsyncSocket使用的更多相关文章
- IOS Socket 04-利用框架CocoaAsyncSocket实现客户端/服务器端
这篇文章,我们介绍CocoaAsyncSocket框架的使用,主要介绍实现客户端/服务器端代码,相信在网上已经很多这样的文章了,这里做一下自己的总结.这里介绍使用GCD方式 一.客户端 1.下载地址 ...
- iOS开发--浅谈CocoaAsyncSocket编程
Socket就是一种特殊的文件.它是一个连接了两个用户的文件,任何一个用户向Socket里写数据,另一个用户都能看得到,不管这两个用户分布在世界上相距多么遥远的角落,感觉就像坐在一起传纸条一样. 这么 ...
- [XMPP]简易的聊天室实现[二](使用CocoaAsyncSocket)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- CocoaAsyncSocket框架的简单封装
在iOS开发中使用socket(CFNetwork),一般都是用第三方库AsyncSocket. 参考博客:http://my.oschina.net/worldligang/blog/396881? ...
- iOS Socket 整理以及CocoaAsyncSocket、SRWebSocket源码解析(一)
写在准备动手的时候: Socket通讯在iOS中也是很常见,自己最近也一直在学习Telegram这个开源项目,Telegram就是在Socket的基础上做的即时通讯,这个相信了解这个开源项目的也都知道 ...
- Socket学习总结系列(二) -- CocoaAsyncSocket
这是系列的第二篇 这是这个系列文章的第二篇,要是没有看第一篇的还是建议看看第一篇,以为这个是接着第一篇梳理的 先大概的总结一下在上篇的文章中说的些内容: 1. 整理了一下做IM我们有那些途径,以及我们 ...
- CocoaAsyncSocket UDP发送数据超过包大小限制(Message too long)
最近在做iOS上,基于UDP传输音视频时遇到的一个问题,这边纪录一下: 由于考虑实时性比较高,所以采用了 CocoaAsyncSocket 的UDP框架来实现,将视频切割成一帧帧的图片发给服务端,不过 ...
- iOS-----简易地CocoaAsyncSocket使用
CocoaAsyncSocket使用 代理的.h文件 //GCDAsyncSocketDelegate执行代理对象 #import <Foundation/Foundation.h> #i ...
- CocoaAsyncSocket 套接字
CocoaAsyncSocket 套接字 https://github.com/robbiehanson/CocoaAsyncSocket Asynchronous socket networki ...
- iOS:基于Socket的第三方框架CocoaAsyncSocket的使用
CocoaAsyncSocket无疑是目前封装得最完善的Socket库了:支持异步TCP/UDP,支持GCD,Objective-C接口封装,同时还有日志跟踪功能,使用此日志跟踪,程序员可以很方便的进 ...
随机推荐
- Linux下判断磁盘是SSD还是HDD的几种方法
环境介绍 Fedora release 25 (Twenty Five) 判断方法 方法一 判断cat /sys/block/*/queue/rotational的返回值(其中*为你的硬盘设备名称,例 ...
- OpenStack Weekly Rank 2015.08.17
Module Reviews Drafted Blueprints Completed Blueprints Filed Bugs Resolved Bugs Cinder 5 1 1 6 13 Sw ...
- 用 JS 做一个数独游戏(二)
用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...
- springboot从入门到精通(三)
再开始第三节之前,先补充一下第二节里出现的小问题,就是springboot的application.properties,我在文件中添加了server.port=9090这个参数,但是启动项目后并未生 ...
- Hibernate课程 初探多对多映射2-4 测试
package com.ddwei.test; import org.hibernate.Session; import org.hibernate.Transaction; import com.d ...
- RequestMapping的使用
1.RequestMapping的作用就是 配置url 2.实现功能: 可以在不同的url访问同一个方法.
- DirectX HLSL 内置函数
Intrinsic Functions (DirectX HLSL) The following table lists the intrinsic functions available in HL ...
- android 屏幕单击位置测试
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- ajax请求传过来的json数据直接转成对应的实体类时出错:400 Bad Request 不进入controller
今天开发过程中,在SpringMVC中的Action中处理前台ajax请求传过来的json数据直接转成对应的实体类时出错:400 Bad Request,后台也不报错,400指的的是请求无效(请求有语 ...
- jquery中对于ul>li列表分页。学习记录
这个是很简单的一种分页,只能对列表进行分页.为了开发有可能需要用到记录下来 Html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T ...