IOS用封装的API AsyncSocket进行网络通信

来源:互联网 发布:拼图软件知乎 编辑:程序博客网 时间:2024/04/28 07:19

AsyncSocket是一个用对象-C封装好的网络通讯的API,调用方便,容易实现

使用AsyncSocket可以很方便的与其它系统进行的Socket通信,AsyncSocket包括TCP和UDP的,通过实现委托AsyncSocketDelegate进行交互。

下面是TCP通讯

API下载地址:点击下载

首先,调用此API时需先引入CFNetWork.framework

然后在#进口“AsyncSocket.h”就可以直接调用了

闲话不多说,上代码:

SocketServer的端代码:

.H文件

[CPP] 鉴于普通副本
  1. @interface的ViewController:的UIViewController <AsyncSocketDelegate,UITextFieldDelegate>  
  2. {  
  3.     AsyncSocket *监听; //监听客户端请求  
  4.     // AsyncUdpSocket * udpSocket; //不需要即时连接就能通讯  
  5.     的NSMutableArray * connectionSockets; //当前请求连接的客户端  
  6.       
  7.     IBOutlet的UITextView * ReceiveData;  
  8.     IBOutlet的UITextField *消息;  
  9. }  
  10.   
  11. @属性(非原子,保留)AsyncSocket *监听;  
  12. @属性(非原子,保留)的UITextField *消息;  
  13. @属性(非原子,保留)的UITextView * ReceiveData;  
  14.   
  15.   
  16. - (IBAction)的sendMessage(ID)发送;  
  17. - (IBAction)textEndEditting:(ID)发送;  



.M文件

[CPP] 鉴于普通副本
  1. #进口“ViewController.h”  
  2. #进口“SocketConfig.h”  
  3.   
  4. @interface的ViewController()  
  5.   
  6. @end  
  7.   
  8. @implementation的ViewController  
  9. @synthesize监听;  
  10. @synthesize消息,ReceiveData;  
  11. BOOL  isRunning = NO; //判断当前插座是否已经开始监听套接字请求  
  12.   
  13. - (无效)的sendMessage  
  14. {  
  15.     如果(!isRunning)  
  16.     {  
  17.         NSError *误差=零;  
  18.         如果 ([listeneracceptOnPort:_SERVER_PORT_error:与错误]!){  
  19.             返回;  
  20.         }  
  21.         的NSLog(@ “开始监听” );  
  22.         isRunning = YES;  
  23.     }  
  24.     其他  
  25.     {  
  26.         的NSLog(@ “重新监听” );  
  27.         [监听器断开];  
  28.          (诠释 I = 0; I <[connectionSocketscount];对我有用){  
  29.             [[connectionSocketsobjectAtIndex:I]断开];  
  30.         }  
  31.         isRunning = FALSE;  
  32.     }  
  33. }  
  34. - (IBAction)的sendMessage(ID)发送  
  35. {  
  36.     如果([message.textisEqual:@! “” ])  
  37.     {  
  38.         [听众writeData:[message.textdataUsingEncoding:NSUTF8StringEncoding]  
  39.                 withTimeout:-1标签:1];  
  40.     }  
  41.     其他  
  42.     {  
  43.         UIAlertView * alertView = [[UIAlertViewalloc] initWithTitle:@ “华林” 消息:@ “请输入消息” 的代表:nilcancelButtonTitle:@ “确定” otherButtonTitles:无,无];  
  44.           
  45.         [alertView秀];  
  46.         [alertView发行];  
  47.     }  
  48. }  
  49. - (IBAction)textEndEditting:(ID)发送  
  50. {  
  51.     [消息resignFirstResponder];  
  52. }  
  53. - (无效)viewDidLoad中  
  54. {  
  55.     ReceiveData.editable = NO; //设置TextView的不可以编辑  
  56.     听众= [[AsyncSocketalloc] initWithDelegate:个体经营];  
  57.     message.delegate =自我;  
  58.     //初始化连接插座的个数  
  59.     connectionSockets = [[NSMutableArrayalloc] initWithCapacity:30];  
  60.     [selfsendMessage];  
  61.     [superviewDidLoad];  
  62. 加载视图,通常从笔尖后//进行任何额外的设置。  
  63. }  
  64. - (BOOL )textFieldShouldReturn:(UITextField的*)文本字段;  
  65. {  
  66.     [文本字段resignFirstResponder];  
  67.     返回 YES;  
  68. }  
  69.   
  70. 的#pragma插座委托  
  71. //连接插座出错时调用  
  72. - (无效)onSocket:(AsyncSocket *)袜子willDisconnectWithError:(NSError *)错误  
  73. {  
  74.     的NSLog(@ “%@” ,[errdescription]);  
  75. }  
  76. //收到新的套接字连接时调用  
  77. - (无效)onSocket:(AsyncSocket *)袜子didAcceptNewSocket:(AsyncSocket *)newSocket  
  78. {  
  79.     //将连接服务的客户端记录起来,以便以后实现客户端通信时使用  
  80.     [connectionSockets ADDOBJECT:newSocket];  
  81. }  
  82. - (无效)onSocket:(AsyncSocket *)袜子didWriteDataWithTag :( )标签  
  83. {  
  84.     [袜子readDataWithTimeout:-1tag:0];  
  85. }  
  86. //与服务器建立连接时调用(连接成功)  
  87. - (无效)onSocket:(AsyncSocket *)袜子didConnectToHost:(的NSString *)主机端口:(UINT16)端口  
  88. {  
  89.     //这里的主机就是当前进行服务器连接的客户端IP  
  90.     的NSLog(@ “主持人:%@” ,主持人);  
  91.     的NSString * returnMessage = @ “欢迎到插槽测试服务器!” ;  
  92.     //将NSString的转换成为NSData的类型  
  93.     NSData的数据* = [returnMessagedataUsingEncoding:NSUTF8StringEncoding];  
  94.     //向当前连接服务器的客户端发送连接成功信息  
  95.     [袜子writeData:数据withTimeout:-1tag:0];  
  96. }  
  97. / ** 
  98.  *当调用套接字已完成读取请求的数据到内存中。 
  99.  *不叫是否有错误。 
  100.  读取客户端发送来的信息(收到插座信息时调用) 
  101.  * /  
  102. - (无效)onSocket:(AsyncSocket *)袜子didReadData:(NSData的*)数据withTag :( )标签  
  103. {  
  104.     的NSString *味精= [[[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding]自动释放];  
  105.     //获取当前发送消息的客户端IP  
  106.     //NSLog(@"%@",sock.connectedHost);  
  107.     //的NSString * ClientIp = [袜子connectedHost];  
  108.     的NSString * receviceIp =零;  
  109. //从所有连接的客户端当中遍历要接收信息的客户端  
  110.     诠释 I = 0; I <[connectionSocketscount],我+ +)  
  111.     {  
  112.         AsyncSocket * S =(AsyncSocket *)[connectionSocketsobjectAtIndex:I];  
  113.   
  114. //这里要说明一下,在想另外一个客户端发送信息时需要指定客户端ip地址,所以在发送消息的时候,应该将ip地址一并写在消息里面,然后由服务端进行处理,我这里这是做了一个简单的Demo,有2个客户端相互发送消息  
  115.   
  116.         如果([sock.connectedHostisEqualToString:@ “10.0.73.252” ])  
  117.         {receviceIp = @ “10.0.73.251” ;}  
  118.         其他  
  119.         {receviceIp = @ “10.0.73.252” ;}  
  120.         如果([s.connectedHostisEqualToString:receviceIp])  
  121.         {  
  122.             [第writeData:数据withTimeout:-1标签:0];  
  123.             如果(MSG)  
  124.             {  
  125.                 ReceiveData.text =味精;  
  126.                 的NSLog(@ “接收消息:%@” ,MSG);  
  127.             }  
  128.             其他  
  129.             {  
  130.                 的NSLog(@ “错误将接收到的数据转换成UTF-8字符串” );  
  131.             }  
  132.         }  
  133.         其他  
  134.         {  
  135.            //如果遍历不存在,则说明客户端为进行连接  
  136.             的NSString * returnMes = @ “对方不在线!” ;  
  137.             的NSData *返回= [returnMesdataUsingEncoding:NSUTF8StringEncoding];  
  138.             [袜子writeData:返回withTimeout:-1标签:0];  
  139.         }  
  140.     }  
  141.   
  142. }  
  143. - (无效)onSocketDidDisconnect:(AsyncSocket *)袜子  
  144. {  
  145.     [connectionSockets REMOVEOBJECT:袜子];  
  146. }  
  147.   
  148. #PRAGMA结束Deleagte  
  149.   
  150. - (无效)didReceiveMemoryWarning  
  151. {  
  152.     [superdidReceiveMemoryWarning];  
  153.     //废弃,可以重新创建任何资源。  
  154. }  
  155.   
  156. - (无效)的dealloc  
  157. {  
  158.     [ReceiveData发布],ReceiveData =零;  
  159.     [信息发布],消息=零;  
  160.     [听众发行];  
  161.     [ReceiveData发行];  
  162.     [超级的dealloc];  
  163. }  
  164. @end  






客户端代码:

ħ文件

[CPP] 鉴于普通副本
  1. 的#import <UIKit中/ UIKit.h>  
  2. #进口“AsyncSocket.h”  
  3.   
  4. @interface的ViewController:的UIViewController <UITextFieldDelegate>  
  5. {  
  6.     AsyncSocket *插座;  
  7. }  
  8. @property(保留,非原子)IBOutlet UITextField的*端ClientIPAddress;  
  9. @property(保留,非原子)IBOutlet的UITextView * ReceiveData;  
  10. @property(保留,非原子)IBOutlet的UITextField * SendMessage函数;  
  11. @property(保留,非原子)IBOutlet的UILabel *状态;  
  12.   
  13. - (IBAction)发送:(ID)发送;  
  14. - (IBAction)ConnectToSever:(ID)发送;  
  15. @end  




米文件

[CPP] 鉴于普通副本
  1. #进口“ViewController.h”  
  2. #进口“的config.h”  
  3. @interface的ViewController()  
  4.   
  5. @end  
  6.   
  7. @implementation的ViewController  
  8.   
  9. - (无效)viewDidLoad中  
  10. {  
  11.     _clientIPAddress.delegate =自我;  
  12.     [_clientIPAddress setTag:1];  
  13.     _SendMessage.delegate =自我;  
  14.     [_SendMessage setTag:2];  
  15.     _ReceiveData.editable = NO;  
  16.     [superviewDidLoad];  
  17. 加载视图,通常从笔尖后//进行任何额外的设置。  
  18. }  
  19. - (无效)textFieldDidBeginEditing:(UITextField的*)文本字段  
  20. {  
  21.     如果([文本字段标签] == 2)  
  22.     {  
  23.         [自我viewUp];  
  24.     }  
  25. }  
  26. - (BOOL )textFieldShouldReturn:(UITextField的*)文本字段;  
  27. {  
  28.       
  29.     [文本字段resignFirstResponder];  
  30.     如果([文本字段标签] == 2)  
  31.     {  
  32.         [自我viewDown];  
  33.     }  
  34.     返回 YES;  
  35. }  
  36. - (BOOL )shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation  
  37. {  
  38.     returnUIInterfaceOrientationPortrait;  
  39. }  
  40. - (无效)didReceiveMemoryWarning  
  41. {  
  42.     [superdidReceiveMemoryWarning];  
  43.     //废弃,可以重新创建任何资源。  
  44. }  
  45. - (IBAction)发送:(ID)发送{  
  46.     如果([_ SendMessage.textisEqualToString:@! “” ] && [_ clientIPAddress.textisEqualToString:@! “” ])  
  47.     {  
  48.         的NSString *消息= [NSStringstringWithFormat:@ “%@:%@” ,_clientIPAddress.text,_SendMessage.text];  
  49.         如果(插座==无)  
  50.         {  
  51.             插座= [[AsyncSocketalloc] initWithDelegate:个体经营];  
  52.         }  
  53.         //的NSString *量= [消息stringByAppendingString:@“\ r \ n”];  
  54.         [插座writeData:[messagedataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1tag:0];  
  55.         _ReceiveData.text = [NSStringstringWithFormat:@ “我说:%@” ,_SendMessage.text];  
  56.     }  
  57.     其他  
  58.     {  
  59.         UIAlertView *警报= [[UIAlertViewalloc] initWithTitle:@ “华林” 消息:@ “请输入消息!” 代表:nilcancelButtonTitle:@ “确定”otherButtonTitles:无,无];  
  60.         [警报显示];  
  61.         [警报发布];  
  62.     }  
  63. }  
  64.   
  65. - (IBAction)ConnectToSever:(ID)发送{  
  66.     如果(插座==无)  
  67.     {  
  68.         插座= [[AsyncSocketalloc] initWithDelegate:个体经营];  
  69.         NSError *误差=零;  
  70.         如果(![socketconnectToHost:_IP_ADDRESS_V4_onPort:_SERVER_PORT_error:&错误])  
  71.         {  
  72.            _Status.text = @ “连接服务器失败!” ;  
  73.         }  
  74.         其他  
  75.         {  
  76.             _Status.text = @ “已连接!” ;  
  77.         }  
  78.     }  
  79.     其他  
  80.     {  
  81.         _Status.text = @ “已连接!” ;  
  82.     }  
  83. }  
  84.   
  85. 的#pragma AsyncScoket Delagate  
  86. - (无效)onSocket:(AsyncSocket *)袜子didConnectToHost:(的NSString *)主机端口:(UINT16)端口{  
  87.     的NSLog(@ “onSocket:%P didConnectToHost:%@口:%胡” ,袜子,主机,端口);  
  88.     [袜子readDataWithTimeout:1tag:0];  
  89. }  
  90. - (无效)onSocket:(AsyncSocket *)袜子didWriteDataWithTag :( )标签  
  91. {  
  92.     [袜子readDataWithTimeout:-1tag:0];  
  93. }  
  94.   
  95. - (无效)onSocket:(AsyncSocket *)袜子didReadData:(NSData的*)数据withTag :( )标记{  
  96.     的NSString * aStr的= [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];  
  97.     self.ReceiveData.text = aStr的;  
  98.     [aStr的释放];  
  99.     [插座readDataWithTimeout:-1tag:0];  
  100. }  
  101.   
  102. - (无效)onSocket:(AsyncSocket *)袜子didSecure :( 布尔)标记  
  103. {  
  104.     的NSLog(@ “onSocket:%P didSecure:YES” ,袜子);  
  105. }  
  106.   
  107. - (无效)onSocket:(AsyncSocket *)袜子willDisconnectWithError:(NSError *)错误  
  108. {  
  109.     的NSLog(@ “onSocket:%P willDisconnectWithError:%@” ,袜子,ERR);  
  110. }  
  111.   
  112. - (无效)onSocketDidDisconnect:(AsyncSocket *)袜子  
  113. {  
  114.     //断开连接了  
  115.     的NSLog(@ “onSocketDidDisconnect:%P” ,袜子);  
  116.     的NSString *味精= @ “很抱歉,这是连接失败” ;  
  117.     _Status.text =味精;  
  118.     [MSG发布];  
  119.     插座=零;  
  120. }  
  121. - (无效)viewUp  
  122. {  
  123.     CGRect帧= self.view.frame;  
  124.     frame.origin.y = frame.origin.y-215;  
  125.     [UIView的beginAnimations:nilcontext:无];  
  126.     [UIView的setAnimationDuration:0.3f];  
  127.     [UIView的setAnimationCurve:UIViewAnimationCurveEaseInOut];  
  128.     self.view.frame =框架;  
  129.     [UIView的commitAnimations];  
  130. }  
  131. - (无效)viewDown  
  132. {  
  133.     CGRect帧= self.view.frame;  
  134.     frame.origin.y = frame.origin.y + 215;  
  135.     [UIView的beginAnimations:nilcontext:无];  
  136.     [UIView的setAnimationDuration:0.3f];  
  137.     [UIView的setAnimationCurve:UIViewAnimationCurveEaseInOut];  
  138.     self.view.frame =框架;  
  139.     [UIView的commitAnimations];  
  140. }  
  141. 年底的#pragma代表  
  142. - (无效)的dealloc {  
  143.     [_ReceiveData发行];  
  144.     [_SendMessage发行];  
  145.     [_status发行];  
  146.     [_clientIPAddress发行];  
  147.     [超级的dealloc];  
  148. }  



演示下载地址:客户端下载      服务端下载

0 0
原创粉丝点击