简介 GCDAsyncSocket 是一个 TCP 库。 通常情况下,我们可以通过下面的代码创建一个 GCDAsyncSocket 的实例 socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue GCDAsyncSocket 通过 unscheduleCFStreams: 函数实现反注册 + (void)unscheduleCFStreams:(GCDAsyncSocket *)asyncSocket 的实例被释放时,会通过下面的代码[4]将让 类GCDAsyncSocket 在 cfstreamThread 线程执行 + (void)unscheduleCFStreams:(GCDAsyncSocket ,避免调用 -[GCDAsyncSocket dealloc] 2、先主动调用-[GCDAsyncSocket disconnect],再释放GCDAsyncSocket的实例 3、通过调整withObject
override init() { super.init() clientSocket = GCDAsyncSocket() clientSocket.delegate = self (), withTimeout: -1, tag: 0) } 发送与接收数据代理回调 // 服务器接收到数据 -->> 接收到数据后抛出去 func socket(_ sock: GCDAsyncSocket (), withTimeout: -1, tag: 0) socketDidReadData(data: data, tag: tag) } func socket(_ sock: GCDAsyncSocket , didWriteDataWithTag tag: Int) -> Void { clientSocket.readData(to: GCDAsyncSocket.crlfData(), withTimeout : -1, tag: 0) } // 断开连接 func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?)
基于GCDAsyncSocket提供的解决方案 基于 CFSocket、GCD 进行的封装,支持 TCP 和 UDP platform :ios, '8.0' inhibit_all_warnings! 1.2 serverSocket #import <GCDAsyncSocket.h> @interface ViewController () { GCDAsyncSocket *_serverSocket 1.3 clientSocket #import <GCDAsyncSocket.h> @interface ViewController () { GCDAsyncSocket *_clientSocket :dispatch_get_main_queue()];//这种是在主线程中运行 //_socket = [[GCDAsyncSocket alloc] initWithDelegate:self } #pragma mark 读取数据 -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
在这里我就着重讲下IOS端的使用和问题 使用到的是CocoaAsyncSocket 中的GCDAsyncSocket (当然CocoaAsyncSocket里也有创建UDP的就不累述) 创建链接 以及对应的回调 目前只想起来这些,至于其他问题,可以留言给我,我们公共探讨,也可以加我的Q:719967870,下面我贴出 基于GCDAsyncSocket封装的单例大家可以直接使用 // TcpClient.h #import <Foundation/Foundation.h> #import "GCDAsyncSocket.h" #import "ITcpClient.h" 哈哈 - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port { DLog CRLFData] withTimeout:-1 tag:0]; } - (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)
基于GCDAsyncSocket提供的解决方案 基于 CFSocket、GCD 进行的封装,支持 TCP 和 UDP platform :ios, '8.0' inhibit_all_warnings > @interface ViewController () { GCDAsyncSocket *_serverSocket; } @property(strong,nonatomic)NSMutableArray NSMutableArray array]; //创建服务端的socket,注意这里的是初始化的同时已经指定了delegate _serverSocket = [[GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{ //sock为服务端的socket,服务端的socket只负责客户端的连接,不负责数据的读取 这里读取数据 [newSocket readDataWithTimeout:-1 tag:100]; } #pragma mark 服务器写数据给客户端 -(void)socket:(GCDAsyncSocket
"; @interface RTSPConnection() <GCDAsyncSocketDelegate> { dispatch_queue_t socketQueue; GCDAsyncSocket init]) { socketQueue = dispatch_queue_create("tcpSocketQueue", NULL); clientSocket = [[GCDAsyncSocket Connection: %@", error.localizedDescription); } } #pragma mard socketDelegate - (void)socket:(GCDAsyncSocket @"didConnectToHost, host: %@, port: %d", host, port); [self doOption]; } - (void)socket:(GCDAsyncSocket err { NSLog(@"socketDidDisconnect: %@", err.localizedDescription); } - (NSTimeInterval)socket:(GCDAsyncSocket
securityPolicy.pinnedCertificates = [NSSet setWithObjects:certData, nil]; return securityPolicy; } GCDAsyncSocket 中 TLS调整 正对自建证书使用以下方案 stackoverflow回答 非自建证书 用以下替换 - (void)socket:(GCDAsyncSocket *)sock didReceiveTrust
[self socketBeginReadData];// 修改为连接建立之后 就立马监听 } 如果想要实时监听服务端的消息推送就可以修改为:连接一旦建立就开始读 - (void)socket:(GCDAsyncSocket - (void)socketBeginReadData { NSLog(@"socketBeginReadData"); [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 maxLength:0 tag:0];//考虑使用-1 } 2.2 业务逻辑的处理 - (void)socket:(GCDAsyncSocket
一、涉及到的第三方库 1、GCDAsyncSocket GCDAsyncSocket是一个封装好的,帮助开发者完成socket的通信过程。数据上传以及接收。 创建scoket对象后,遵循它的代理,里面有一个最重要的方法: 接受解析服务器数据 - (void)socket:(GCDAsyncSocket *)socket didReadData:(NSData
这里大概说一下: GCDAsyncSocket 是基于TCP协议写的 GCDAsyncUdpSocket 认识一下CocoaAsyncSocket的源码 (建议先文章最后下载Demo) 下面我们开始整理分析CocoaAsyncSocket的GCDAsyncSocket部分的源码,这部分代码量在九千多行 ,我们这一次按照它.h的可以给外面调用的方法开始认识它的源码,具体的每一行的注释你可以下载Demo去看Demo中GCDAsyncSocket部分的源码,上面给了很详细的注释,然后我们这里就是按照.h的方法去总结 在这里就调用了我们GCDAsyncSocket中接收消息的代理方法: ?
假设你想做基于套接字的IO,我仅仅能推荐GCDAsyncSocket。我曾经尝试套接字编程iQuassel项目有几个原因,主要由于你必须使用Carbon取代Cocoa。 GCDAsyncSocket也有不错的优势,您能够非常easy地在一个线程中进行网络协议解析,避免堵塞UI线程。
Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码 socket.io 是跨平台的,可以实现多平台的即时通讯 由于 iOS 端进行 socket 编程主要使用 GCDAsyncSocket 地址 https://github.com/HOWIE-CH/-You-guess-I-painted-_socket 七、其他 使用 socket.io,感觉传输数据很方便,api 简单,也没有像 GCDAsyncSocket
如何进阶 在开发的过程中加强这些方面的学习,比如并发编程、逆向工程、设计模式、Runtime、Runloop等,然后再把常用的一些开源框架深入研究一下; 挑选一个常用源码(AF、SD、YYKit、GCDAsyncSocket
://github.com/xiaotanit/Tan_ProtocolBuffer 原文链接:http://www.cnblogs.com/tandaxia/p/6181534.html 关于使用GCDAsyncSocket
主要代码如下: 这边因为需要添加重连操作, 所以我在GCDAsyncSocket的基础上又封装了一下, 但总体代码不多, 应该比较好理解. 这里需要注意的是GCDAsyncSocket的连接接口(connectToHost: onPort: error:)是同步调用的, 慢网情况下可能会阻塞线程一段时间, 所以这里我单开了一个线程来做连接操作
遇到这个问题,在你的网络不稳定的时候,当Socket链接的时候会出现Crash,解决的办法在网上查找之后又两个常见的方案,自己最近也是在看这个CocoaAsyncSocket的源码,最主要的也就是常见的GCDAsyncSocket
GCDAsyncSocket - GCDAsyncSocket,不错的Demo。 Just - 小而美的HTTP类。功能简单,直接,完整且健壮性高 - swift。
此处填服务器IP地址" forKey:GCDAsyncSocketSSLPeerName]; // 如果不是自签名证书,而是权威证书颁发机构注册申请的证书,这个settings字典可不传(将使用GCDAsyncSocket
首先描述下碰到的问题: 1、服务器发送内容很长的数据过来的时候,GCDAsyncSocket监听收到的一个包解析不了,一直要接收好几个包拼接才是这条数据的完整包,即所谓的拆包/断包; 2、服务器快速发送多条数据过来 /** 监听来自服务器的消息代理方法 */ - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long) saveReceiveInfo:(ChatMsg *)obj{ //... } --------------------- print log test start --------------------- 在GCDAsyncSocket