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

钱飞翼
2023-12-01

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

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

下面是TCP通讯

API 下载地址 :点击下载

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

然后在#import "AsyncSocket.h"就可以直接调用了

闲话不多说,上代码:

SocketServer端代码:

.h文件

  1. @interface ViewController :UIViewController<AsyncSocketDelegate,UITextFieldDelegate>  
  2. {  
  3.     AsyncSocket *listener;//监听客户端请求  
  4.     //AsyncUdpSocket *udpSocket;//不需要即时连接就能通讯  
  5.     NSMutableArray *connectionSockets;//当前请求连接的客户端  
  6.       
  7.     IBOutlet UITextView *ReceiveData;  
  8.     IBOutlet UITextField *message;  
  9. }  
  10.   
  11. @property (nonatomic, retain)AsyncSocket *listener;  
  12. @property (nonatomic, retain)UITextField *message;  
  13. @property (nonatomic, retain)UITextView *ReceiveData;  
  14.   
  15.   
  16. - (IBAction)sendMessage:(id)sender;  
  17. - (IBAction)textEndEditting:(id)sender;  



.m文件

  1. #import "ViewController.h"  
  2. #import "SocketConfig.h"  
  3.   
  4. @interface ViewController ()  
  5.   
  6. @end  
  7.   
  8. @implementation ViewController  
  9. @synthesize listener;  
  10. @synthesize message,ReceiveData;  
  11. bool isRunning = NO;//判断当前socket是否已经开始监听socket请求  
  12.   
  13. -(void) sendMessage  
  14. {  
  15.     if(!isRunning)  
  16.     {  
  17.         NSError *error = nil;  
  18.         if (![listeneracceptOnPort:_SERVER_PORT_error:&error]) {  
  19.             return;  
  20.         }  
  21.         NSLog(@"开始监听");  
  22.         isRunning = YES;  
  23.     }  
  24.     else  
  25.     {  
  26.         NSLog(@"重新监听");  
  27.         [listener disconnect];  
  28.         for (int i = 0; i < [connectionSocketscount]; i++) {  
  29.             [[connectionSocketsobjectAtIndex:i]disconnect];  
  30.         }  
  31.         isRunning = FALSE;  
  32.     }  
  33. }  
  34. - (IBAction)sendMessage:(id)sender  
  35. {  
  36.     if(![message.textisEqual:@""])  
  37.     {  
  38.         [listener writeData:[message.textdataUsingEncoding:NSUTF8StringEncoding]  
  39.                 withTimeout:-1 tag:1];  
  40.     }  
  41.     else  
  42.     {  
  43.         UIAlertView *alertView =[[UIAlertViewalloc]initWithTitle:@"Waring"message:@"Please Input Message"delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];  
  44.           
  45.         [alertView show];  
  46.         [alertView release];  
  47.     }  
  48. }  
  49. - (IBAction)textEndEditting:(id)sender  
  50. {  
  51.     [message resignFirstResponder];  
  52. }  
  53. - (void)viewDidLoad  
  54. {  
  55.     ReceiveData.editable=NO;//设置TextView不可以编辑  
  56.     listener=[[AsyncSocketalloc]initWithDelegate:self];  
  57.     message.delegate=self;  
  58.     //初始化连接socket的个数  
  59.     connectionSockets=[[NSMutableArrayalloc]initWithCapacity:30];  
  60.     [selfsendMessage];  
  61.     [superviewDidLoad];  
  62. // Do any additional setup after loading the view, typically from a nib.  
  63. }  
  64. - (BOOL)textFieldShouldReturn:(UITextField *)textField;  
  65. {  
  66.     [textField resignFirstResponder];  
  67.     return YES;  
  68. }  
  69.   
  70. #pragma socket委托  
  71. //连接socket出错时调用  
  72. - (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err  
  73. {  
  74.     NSLog(@"%@",[errdescription]);  
  75. }  
  76. //收到新的socket连接时调用  
  77. - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket  
  78. {  
  79.     //将连接服务的客户端记录起来,以便以后实现客户端通信时使用  
  80.     [connectionSockets addObject:newSocket];  
  81. }  
  82. - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag  
  83. {  
  84.     [sock readDataWithTimeout: -1tag: 0];  
  85. }  
  86. //与服务器建立连接时调用(连接成功)  
  87. - (void) onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port  
  88. {  
  89.     //这里的host就是当前进行服务器连接的客户端ip  
  90.     NSLog(@"host:%@",host);  
  91.     NSString *returnMessage=@"Welcome To Socket Test Server!";  
  92.     //将NSString转换成为NSData类型  
  93.     NSData *data=[returnMessagedataUsingEncoding:NSUTF8StringEncoding];  
  94.     //向当前连接服务器的客户端发送连接成功信息  
  95.     [sock writeData:data withTimeout:-1tag:0];  
  96. }  
  97. /** 
  98.  * Called when a socket has completed reading the requested data into memory. 
  99.  * Not called if there is an error. 
  100.  读取客户端发送来的信息(收到socket信息时调用) 
  101.  **/  
  102. - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag  
  103. {  
  104.     NSString *msg = [[[NSStringalloc]initWithData: dataencoding:NSUTF8StringEncoding]autorelease];  
  105.     //获取当前发送消息的客户端ip  
  106.     //NSLog(@"%@",sock.connectedHost);  
  107.     //NSString *ClientIp=[sock connectedHost];  
  108.     NSString *receviceIp=nil;  
  109. //从所有连接的客户端当中遍历要接收信息的客户端  
  110.     for(int i=0;i<[connectionSocketscount];i++)  
  111.     {  
  112.         AsyncSocket *s=(AsyncSocket*)[connectionSocketsobjectAtIndex:i];  
  113.   
  114. //这里要说明一下,在想另外一个客户端发送信息时需要指定客户端ip地址,所以在发送消息的时候,应该将ip地址一并写在消息里面,然后由服务端进行处理,我这里这是做了一个简单的Demo,有2个客户端相互发送消息  
  115.   
  116.         if([sock.connectedHostisEqualToString:@"10.0.73.252"])  
  117.         {receviceIp=@"10.0.73.251";}  
  118.         else  
  119.         {receviceIp=@"10.0.73.252";}  
  120.         if([s.connectedHostisEqualToString:receviceIp])  
  121.         {  
  122.             [s writeData:data withTimeout:-1 tag:0];  
  123.             if(msg)  
  124.             {  
  125.                 ReceiveData.text = msg;  
  126.                 NSLog(@"Receive Message:%@",msg);  
  127.             }  
  128.             else  
  129.             {  
  130.                 NSLog(@"Error converting received data into UTF-8 String");  
  131.             }  
  132.         }  
  133.         else  
  134.         {  
  135.            //如果遍历不存在,则说明客户端为进行连接  
  136.             NSString *returnMes=@"对方不在线!";  
  137.             NSData *datareturn=[returnMesdataUsingEncoding:NSUTF8StringEncoding];  
  138.             [sock writeData:datareturn withTimeout:-1 tag:0];  
  139.         }  
  140.     }  
  141.   
  142. }  
  143. - (void)onSocketDidDisconnect:(AsyncSocket *)sock  
  144. {  
  145.     [connectionSockets removeObject:sock];  
  146. }  
  147.   
  148. #pragma end Deleagte  
  149.   
  150. - (void)didReceiveMemoryWarning  
  151. {  
  152.     [superdidReceiveMemoryWarning];  
  153.     // Dispose of any resources that can be recreated.  
  154. }  
  155.   
  156. - (void)dealloc  
  157. {  
  158.     [ReceiveData release],ReceiveData=nil;  
  159.     [message release],message=nil;  
  160.     [listener release];  
  161.     [ReceiveData release];  
  162.     [super dealloc];  
  163. }  
  164. @end  






客户端代码:

h文件

  1. #import <UIKit/UIKit.h>  
  2. #import "AsyncSocket.h"  
  3.   
  4. @interface ViewController :UIViewController<UITextFieldDelegate>  
  5. {  
  6.     AsyncSocket *socket;  
  7. }  
  8. @property (retain, nonatomic) IBOutlet UITextField *clientIPAddress;  
  9. @property (retain, nonatomic) IBOutlet UITextView *ReceiveData;  
  10. @property (retain, nonatomic) IBOutlet UITextField *SendMessage;  
  11. @property (retain, nonatomic) IBOutlet UILabel *Status;  
  12.   
  13. - (IBAction)Send:(id)sender;  
  14. - (IBAction)ConnectToSever:(id)sender;  
  15. @end  




m文件

  1. #import "ViewController.h"  
  2. #import "Config.h"  
  3. @interface ViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation ViewController  
  8.   
  9. - (void)viewDidLoad  
  10. {  
  11.     _clientIPAddress.delegate=self;  
  12.     [_clientIPAddress setTag:1];  
  13.     _SendMessage.delegate=self;  
  14.     [_SendMessage setTag:2];  
  15.     _ReceiveData.editable=NO;  
  16.     [superviewDidLoad];  
  17. // Do any additional setup after loading the view, typically from a nib.  
  18. }  
  19. - (void) textFieldDidBeginEditing:(UITextField *)textField  
  20. {  
  21.     if([textField tag]==2)  
  22.     {  
  23.         [self viewUp];  
  24.     }  
  25. }  
  26. - (BOOL)textFieldShouldReturn:(UITextField *)textField;  
  27. {  
  28.       
  29.     [textField resignFirstResponder];  
  30.     if([textField tag]==2)  
  31.     {  
  32.         [self viewDown];  
  33.     }  
  34.     return YES;  
  35. }  
  36. - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation  
  37. {  
  38.     returnUIInterfaceOrientationPortrait;  
  39. }  
  40. - (void)didReceiveMemoryWarning  
  41. {  
  42.     [superdidReceiveMemoryWarning];  
  43.     // Dispose of any resources that can be recreated.  
  44. }  
  45. - (IBAction)Send:(id)sender {  
  46.     if(![_SendMessage.textisEqualToString:@""] && ![_clientIPAddress.textisEqualToString:@""])  
  47.     {  
  48.         NSString *message=[NSStringstringWithFormat:@"%@:%@",_clientIPAddress.text,_SendMessage.text];  
  49.         if(socket==nil)  
  50.         {  
  51.             socket=[[AsyncSocketalloc]initWithDelegate:self];  
  52.         }  
  53.         //NSString *content=[message stringByAppendingString:@"\r\n"];  
  54.         [socket writeData:[messagedataUsingEncoding:NSUTF8StringEncoding]withTimeout:-1tag:0];  
  55.         _ReceiveData.text=[NSStringstringWithFormat:@"me:%@",_SendMessage.text];  
  56.     }  
  57.     else  
  58.     {  
  59.         UIAlertView *alert=[[UIAlertViewalloc]initWithTitle:@"Waring"message:@"Please input Message!"delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];  
  60.         [alert show];  
  61.         [alert release];  
  62.     }  
  63. }  
  64.   
  65. - (IBAction)ConnectToSever:(id)sender {  
  66.     if(socket==nil)  
  67.     {  
  68.         socket=[[AsyncSocketalloc]initWithDelegate:self];  
  69.         NSError *error=nil;  
  70.         if(![socketconnectToHost:_IP_ADDRESS_V4_onPort:_SERVER_PORT_error:&error])  
  71.         {  
  72.            _Status.text=@"连接服务器失败!";  
  73.         }  
  74.         else  
  75.         {  
  76.             _Status.text=@"已连接!";  
  77.         }  
  78.     }  
  79.     else  
  80.     {  
  81.         _Status.text=@"已连接!";  
  82.     }  
  83. }  
  84.   
  85. #pragma AsyncScoket Delagate  
  86. - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {  
  87.     NSLog(@"onSocket:%p didConnectToHost:%@ port:%hu",sock,host,port);  
  88.     [sock readDataWithTimeout:1tag:0];  
  89. }  
  90. - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag  
  91. {  
  92.     [sock readDataWithTimeout: -1tag: 0];  
  93. }  
  94.   
  95. - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {  
  96.     NSString* aStr = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];  
  97.     self.ReceiveData.text = aStr;  
  98.     [aStr release];  
  99.     [socket readDataWithTimeout:-1tag:0];  
  100. }  
  101.   
  102. - (void)onSocket:(AsyncSocket *)sock didSecure:(BOOL)flag  
  103. {  
  104.     NSLog(@"onSocket:%p didSecure:YES", sock);  
  105. }  
  106.   
  107. - (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err  
  108. {  
  109.     NSLog(@"onSocket:%p willDisconnectWithError:%@", sock, err);  
  110. }  
  111.   
  112. - (void)onSocketDidDisconnect:(AsyncSocket *)sock  
  113. {  
  114.     //断开连接了  
  115.     NSLog(@"onSocketDidDisconnect:%p", sock);  
  116.     NSString *msg =@"Sorry this connect is failure";  
  117.     _Status.text=msg;  
  118.     [msg release];  
  119.     socket = nil;  
  120. }  
  121. - (void) viewUp  
  122. {  
  123.     CGRect frame=self.view.frame;  
  124.     frame.origin.y=frame.origin.y-215;  
  125.     [UIView beginAnimations:nilcontext:nil];  
  126.     [UIView setAnimationDuration:0.3f];  
  127.     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];  
  128.     self.view.frame=frame;  
  129.     [UIView commitAnimations];  
  130. }  
  131. - (void) viewDown  
  132. {  
  133.     CGRect frame=self.view.frame;  
  134.     frame.origin.y=frame.origin.y+215;  
  135.     [UIView beginAnimations:nilcontext:nil];  
  136.     [UIView setAnimationDuration:0.3f];  
  137.     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];  
  138.     self.view.frame=frame;  
  139.     [UIView commitAnimations];  
  140. }  
  141. #pragma end Delegate  
  142. - (void)dealloc {  
  143.     [_ReceiveData release];  
  144.     [_SendMessage release];  
  145.     [_Status release];  
  146.     [_clientIPAddress release];  
  147.     [super dealloc];  
  148. }  



Demo下载地址:客户端下载      服务端下载

 类似资料: