iOS之GCDAsyncSocket(TCP)

上周周末的时候发烧了,就担误了写博客,这周就多写点吧。

这次主要讲下Socket,关于它的三次握手、四次挥手什么的已经写的很多了,也写的很好,我就不写了。但注释代码时会穿插些Socket原理进去,当然也会提供Demo。

TCP Socket Server

#import "GCDAysncSocket.h"遵守协议<GCDAsyncSocketDelegate>

创建一个socket:
self.serverSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
监听端口:
    NSError * error = nil;
    [self.serverSocket acceptOnPort:[self.portTextField.text integerValue] error:&error];
等待连接://此为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    //这里需要对Socket的工作原理进行一点解释,当Socket accept一个连接服务请求时,将生成一个新的Socket,即此处的newSocket。在此可查看newSocket.connectedHost和newSocket.connectedPort等参数,并通过新的socket向客户端发送一包数据后会关闭你一开始创建的socket(self.serverSocket),接下来你都将使用newSocket(我将此保存为self.clientSocket)
    self.clientSocket = newSocket;
}
连接失败://此为GCDAsyncSocket代理方法
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;
{
    NSLog(@"连接失败,要怎么做,你自己看着办吧");
}
连接成功,发送数据
//注意此处使用的是上面的newSocket
[self.clientSocket writeData:[self.sendTextView.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
    //我创建了一个Socket单例,这里只讨论Socket,单例创建可看Demo
    SocketManager * socketManager = [SocketManager sharedSocketManager];
    [socketManager.mySocket readDataWithTimeout:-1 tag:0];
对发送的数据根据tag进行管理://此为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    NSLog(@"可通过参数中的tag值管理发送的数据,想怎么管理,您看着办");
}
连接成功,接收数据
    //同样使用的是newSocket
    [self.clientSocket readDataWithTimeout:-1 tag:0];
接收数据成功,处理数据://此为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSLog(@"接收到消息%@,要怎么处理,您看着办",data);
}

这是服务器Demo,欢迎大家Star


TCP Socket Client

#import "GCDAysncSocket.h"遵守协议<GCDAsyncSocketDelegate>

创建Socket:
self.clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
连接服务器:
    NSError * error = nil;
    [self.clientSocket connectToHost:self.ipTextField.text onPort:[self.portTextField.text integerValue] error:&error];
连接成功://此处为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
    //创建的socket单例
    SocketManager * socketManager = [SocketManager sharedSocketManager];
    socketManager.mySocket = sock;
}
连接失败://此处为GCDAsyncSocket代理方法
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    NSLog(@"自己看着办");
}
连接成功,发送数据
    [self.clientSocket writeData:[self.sendTextView.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
连接成功,接收数据
    [self.clientSocket readDataWithTimeout:-1 tag:0];
接收数据成功,处理数据://此处为GCDAsyncSocket代理方法
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSLog(@"接收到消息%@,要怎么处理,您看着办",data);
}

到此处就结束了,大家可以发现,客户端这边从头到尾都是使用的一个Socket,并没有出现新的Socket,这一点是需要注意的。客户端Demo,欢迎大家Star.

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载:http://www.cocoachina.com/ios/20170615/19529.html 参考:h...
    F麦子阅读 9,469评论 3 2
  • 本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS...
    小冰山口阅读 4,786评论 5 4
  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 6,684评论 2 12
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,850评论 6 13
  • 杞人者,吾友王兄恩御,定远人氏。淮北师范大学教授,今卜居淮安。君心系古学,能诗善饮,虽与我相距遥远,却时有...
    丁怀超阅读 1,885评论 1 3