【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)

分类: 【MAC/IOS下开发】 【网络编程】 2013-11-21 17:29 11510人阅读 评论(4) 收藏 举报
IOSsocketAsyncSocketGCDAsyncSocket

Socket描述了一个IP、端口对。它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息。所以,Socket一定包含了通信的双发,即客户端(Client)与服务端(server)。

1)服务端利用Socket监听端口;

2)客户端发起连接;

3)服务端返回信息,建立连接,开始通信;

4)客户端,服务端断开连接。

1套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应 用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

2 建立socket连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发 给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

4、SOCKET连接与TCP连接

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

5、Socket连接与HTTP连接

由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网 络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

很多情况下,需要服务器端主动向客户端推送

iphone的标准推荐CFNetwork C库编程.但是编程比较烦躁。在其它OS往往用类来封装的对Socket函数的处理。比如MFC的CAsysncSocket.在iphone也有类似于 开源项目.cocoa AsyncSocket库, 官方网站:http://code.google.com/p/cocoaasyncsocket/ 它用来简化 CFnetwork的调用.

一.在项目引入ASyncSocket库

1.下载ASyncSocket库源码

2.把ASyncSocket库源码加入项目:只需要增加RunLoop目录中的AsyncSocket.h、AsyncSocket.m、AsyncUdpSocket.h和AsyncUdpSocket.m四个文件。

3.在项目增加CFNetwork框架

在Framework目录右健,选择Add-->Existing Files...    , 选择 CFNetwork.framework

二.TCP客户端

1. 在controller头文件定义AsyncSocket对象

  1. #import #import "AsyncSocket.h"
  2. @interface HelloiPhoneViewController : UIViewController {    UITextField    * textField;    AsyncSocket * asyncSocket;}@property (retain, nonatomic) IBOutlet UITextField *textField;- (IBAction) buttonPressed: (id)sender;- (IBAction) textFieldDoneEditing: (id)sender;    @end

复制代码

2.在需要联接地方使用connectToHost联接服务器

其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用.

asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];

  1. NSError *err = nil;     if(![asyncSocket connectToHost:host on:port error:&err])     {         NSLog(@"Error: %@", err);     }

复制代码

3.增加Socket响应事件

因为initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法.

4.关于NSData对象

无论SOCKET收发都采用NSData对象.

NSData主要是带一个(id)data指向的数据空间和长度 length.

NSString 转换成NSData 对象

  1. NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];

复制代码

NSData 转换成NSString对象

NSData * data;

  1. NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];

复制代码

4.发送数据

AsyncSocket  writeData    方法来发送数据,它有如下定义

  1. - (void)writeDataNSData *)data withTimeoutNSTimeInterval)timeout taglong)tag;

复制代码

以下是一个实例语句.

  1. NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding];     [sock writeData:aData withTimeout:-1 tag:1];

复制代码

在onSocket重载函数,有如定义采用是专门用来处理SOCKET的发送数据的:

-(void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag

  1. {      NSLog(@"thread(%),onSocket:%p didWriteDataWithTag:%d",[[NSThread currentThread] name],     sock,tag);}

复制代码

5.接收Socket数据.

在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的.

  1. -(void) onSocketAsyncSocket *)sock didReadDataNSData *)data withTaglong)tag

复制代码

在中间将其转换成NSString进行显示.

  1. NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];     NSLog(@"===%@",aStr);     [aStr release];

复制代码

下面是用开源的库Asyncsocket的例子:

  1. //
  2. //  SocketDemoViewController.h
  3. //  SocketDemo
  4. //
  5. //  Created by xiang xiva on 10-7-10.
  6. //  Copyright 2010 __MyCompanyName__. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "AsyncSocket.h"
  10. #define SRV_CONNECTED 0
  11. #define SRV_CONNECT_SUC 1
  12. #define SRV_CONNECT_FAIL 2
  13. #define HOST_IP @"192.168.110.1"
  14. #define HOST_PORT 8080
  15. @interface SocketDemoViewController : UIViewController {
  16. UITextField *inputMsg;
  17. UILabel *outputMsg;
  18. AsyncSocket *client;
  19. }
  20. @property (nonatomic, retain) AsyncSocket *client;
  21. @property (nonatomic, retain) IBOutlet UITextField *inputMsg;
  22. @property (nonatomic, retain) IBOutlet UILabel *outputMsg;
  23. - (int) connectServer: (NSString *) hostIP port:(int) hostPort;
  24. - (void) showMessage:(NSString *) msg;
  25. - (IBAction) sendMsg;
  26. - (IBAction) reConnect;
  27. - (IBAction) textFieldDoneEditing:(id)sender;
  28. - (IBAction) backgroundTouch:(id)sender;
  29. @end
  30. //
  31. //  SocketDemoViewController.m
  32. //  SocketDemo
  33. //
  34. //  Created by xiang xiva on 10-7-10.
  35. //  Copyright 2010 __MyCompanyName__. All rights reserved.
  36. //
  37. #import "SocketDemoViewController.h"
  38. @implementation SocketDemoViewController
  39. @synthesize inputMsg, outputMsg;
  40. @synthesize client;
  41. /*
  42. // The designated initializer. Override to perform setup that is required before the view is loaded.
  43. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  44. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  45. if (self) {
  46. // Custom initialization
  47. }
  48. return self;
  49. }
  50. */
  51. /*
  52. // Implement loadView to create a view hierarchy programmatically, without using a nib.
  53. - (void)loadView {
  54. }
  55. */
  56. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
  57. - (void)viewDidLoad {
  58. //[super viewDidLoad];
  59. [self connectServer:HOST_IP port:HOST_PORT];
  60. //监听读取
  61. }
  62. // Override to allow orientations other than the default portrait orientation.
  63. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  64. return YES;
  65. }
  66. - (void)didReceiveMemoryWarning {
  67. // Releases the view if it doesn't have a superview.
  68. [super didReceiveMemoryWarning];
  69. // Release any cached data, images, etc that aren't in use.
  70. }
  71. - (void)viewDidUnload {
  72. self.client = nil;
  73. // Release any retained subviews of the main view.
  74. // e.g. self.myOutlet = nil;
  75. }
  76. - (int) connectServer: (NSString *) hostIP port:(int) hostPort{
  77. if (client == nil) {
  78. client = [[AsyncSocket alloc] initWithDelegate:self];
  79. NSError *err = nil;
  80. //192.168.110.128
  81. if (![client connectToHost:hostIP onPort:hostPort error:&err]) {
  82. NSLog(@"%@ %@", [err code], [err localizedDescription]);
  83. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@"Connection failed to host "
  84. stringByAppendingString:hostIP]
  85. message:[[[NSString alloc]initWithFormat:@"%@",[err code]] stringByAppendingString:[err localizedDescription]]
  86. delegate:self
  87. cancelButtonTitle:@"OK"
  88. otherButtonTitles:nil];
  89. [alert show];
  90. [alert release];
  91. //client = nil;
  92. return SRV_CONNECT_FAIL;
  93. } else {
  94. NSLog(@"Conectou!");
  95. return SRV_CONNECT_SUC;
  96. }
  97. }
  98. else {
  99. [client readDataWithTimeout:-1 tag:0];
  100. return SRV_CONNECTED;
  101. }
  102. }
  103. - (IBAction) reConnect{
  104. int stat = [self connectServer:HOST_IP port:HOST_PORT];
  105. switch (stat) {
  106. case SRV_CONNECT_SUC:
  107. [self showMessage:@"connect success"];
  108. break;
  109. case SRV_CONNECTED:
  110. [self showMessage:@"It's connected,don't agian"];
  111. break;
  112. default:
  113. break;
  114. }
  115. }
  116. - (IBAction) sendMsg{
  117. NSString *inputMsgStr = self.inputMsg.text;
  118. NSString * content = [inputMsgStr stringByAppendingString:@"\r\n"];
  119. NSLog(@"%a",content);
  120. NSData *data = [content dataUsingEncoding:NSISOLatin1StringEncoding];
  121. [client writeData:data withTimeout:-1 tag:0];
  122. //[data release];
  123. //[content release];
  124. //[inputMsgStr release];
  125. //继续监听读取
  126. //[client readDataWithTimeout:-1 tag:0];
  127. }
  128. #pragma mark -
  129. #pragma mark close Keyboard
  130. - (IBAction) textFieldDoneEditing:(id)sender{
  131. [sender resignFirstResponder];
  132. }
  133. - (IBAction) backgroundTouch:(id)sender{
  134. [inputMsg resignFirstResponder];
  135. }
  136. #pragma mark socket uitl
  137. - (void) showMessage:(NSString *) msg{
  138. UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"Alert!"
  139. message:msg
  140. delegate:nil
  141. cancelButtonTitle:@"OK"
  142. otherButtonTitles:nil];
  143. [alert show];
  144. [alert release];
  145. }
  146. #pragma mark socket delegate
  147. - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
  148. [client readDataWithTimeout:-1 tag:0];
  149. }
  150. - (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
  151. {
  152. NSLog(@"Error");
  153. }
  154. - (void)onSocketDidDisconnect:(AsyncSocket *)sock
  155. {
  156. NSString *msg = @"Sorry this connect is failure";
  157. [self showMessage:msg];
  158. [msg release];
  159. client = nil;
  160. }
  161. - (void)onSocketDidSecure:(AsyncSocket *)sock{
  162. }
  163. - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
  164. NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  165. NSLog(@"Hava received datas is :%@",aStr);
  166. self.outputMsg.text = aStr;
  167. [aStr release];
  168. [client readDataWithTimeout:-1 tag:0];
  169. }
  170. #pragma mark dealloc
  171. - (void)dealloc {
  172. [client release];
  173. [inputMsg release];
  174. [outputMsg release];
  175. [super dealloc];
  176. }
  177. @end

复制代码

文章来源:http://my.oschina.net/amoyai/blog/91694

【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)相关推荐

  1. socket第三方库 AsyncSocket(GCDAsyncSocket)

    为什么80%的码农都做不了架构师?>>>    Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些 ...

  2. socket第三方库 AsyncSocket(源码注释解读.转)

    作者 OneTea 关注 2016.09.19 11:33* 字数 0 阅读 83评论 0喜欢 1 #import <Foundation/Foundation.h> @class Asy ...

  3. 2018年最全iOS开发之第三方库

    最全iOS开发之第三方库 最新增加 EAIntroView 一个灵活的介绍界面,可以用作引导页 UI 下拉刷新 EGOTableViewPullRefresh– 最早的下拉刷新控件. SVPullTo ...

  4. 史上最全iOS开发之第三方库整理汇总

    UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITable ...

  5. iOS开发常用第三方库

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...

  6. 一些iOS常用的第三方库和控件及第三方框架还有动画

    网络通信 1.ASIHTTPRequest 这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动).在不同iOS版本上略微有一些小 ...

  7. iOS之常用第三方库的介绍

    因为iOS SDK相对比较底层,所以开发者就得受累多做一些体力活.不过幸运的是,有很多第三方的类库可以用来简化很多不必要的工作. (1)AFNetworking 目前比较推荐的iOS网络请求组件,默认 ...

  8. 一些 iOS 常用的第三方库

    网络通信 AFNetworking 轻量级的通讯类库,使用非常简单.建议更新到最新版,前几天看新闻说之前有个逻辑性的 bug https://github.com/AFNetworking/AFNet ...

  9. Unreal4 IOS上使用第三方库和C++11 特性问题解决

    http://blog.sina.com.cn/s/blog_7c5fd2e90102uwht.html 久违了我的朋友们,由于最近有个重要版本一直没有更新博客,希望大家还没有忘记我们.今天主要跟大家 ...

  10. iOS 16 修改第三方库实现监听 SwiftUI 中 sheet 弹出视图的下滑关闭动作

    功能需求 我们已经在 iOS 16 中 SwiftUI 防止弹出的 sheet 视图被下滑关闭(dismiss)的新解决方案 这篇博文中介绍过如何在 iOS 16 中禁止用户下滑关闭弹出的 sheet ...

最新文章

  1. html打地鼠游戏设计报告,有趣的Axure案例:打地鼠游戏的设计
  2. curd boy 入门
  3. android 利用eclipse观察内存变化情况
  4. IMPDP table_exists_action 参数的应用
  5. LeetCode 79 Word Search(单词查找)
  6. centos找不到IFCONFIG命令
  7. 高质量SQL的30条建议!(后端必备)
  8. 训练日志 2018.11.28
  9. Android 系统(137)---android打包解包boot.img,system.img
  10. 黑龙江省:到2025年将建成5G基站11.4万个
  11. JAVA编程思想——读书笔记 对象的容纳
  12. 微信小程序获取Token 存储2小时
  13. 富文本编辑器使用案例
  14. 2022年新出的Python学习神器,强烈推荐
  15. linux查看占用负载的程序,Linux中查看负载
  16. 基于GNN网络的session推荐模型(知识图谱技术在推荐场景的应用)
  17. WinRAR 破解方法详解.-----------超级简单 1分钟搞定~
  18. 机器学习面试题之机器学习基础(一)
  19. 使用Android Studio来为Cocos2dx-lua项目打包
  20. 教你解决线上频出MySQL死锁问题

热门文章

  1. android APK 查看程序MD5
  2. 给自己的心灵一把独到的标尺
  3. 《加密与解密》笔记五(二)
  4. 基于Arch的live系统
  5. 民营股份制企业是什么意思
  6. python矩阵运算算法_Python常用库Numpy进行矩阵运算详解
  7. 关于MySQL加载驱动错误问题。
  8. Windows 使用命令行查看 wifi 密码
  9. UOJ#449. 【集训队作业2018】喂鸽子(期望dp)
  10. android wear iphone7,多款Android Wear手表不兼容苹果iPhone7