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文件
- @interface的ViewController:的UIViewController <AsyncSocketDelegate,UITextFieldDelegate>
- {
- AsyncSocket *监听; //监听客户端请求
- // AsyncUdpSocket * udpSocket; //不需要即时连接就能通讯
- 的NSMutableArray * connectionSockets; //当前请求连接的客户端
- IBOutlet的UITextView * ReceiveData;
- IBOutlet的UITextField *消息;
- }
- @属性(非原子,保留)AsyncSocket *监听;
- @属性(非原子,保留)的UITextField *消息;
- @属性(非原子,保留)的UITextView * ReceiveData;
- - (IBAction)的sendMessage(ID)发送;
- - (IBAction)textEndEditting:(ID)发送;
.M文件
- #进口“ViewController.h”
- #进口“SocketConfig.h”
- @interface的ViewController()
- @end
- @implementation的ViewController
- @synthesize监听;
- @synthesize消息,ReceiveData;
- BOOL isRunning = NO; //判断当前插座是否已经开始监听套接字请求
- - (无效)的sendMessage
- {
- 如果(!isRunning)
- {
- NSError *误差=零;
- 如果 ([listeneracceptOnPort:_SERVER_PORT_error:与错误]!){
- 返回;
- }
- 的NSLog(@ “开始监听” );
- isRunning = YES;
- }
- 其他
- {
- 的NSLog(@ “重新监听” );
- [监听器断开];
- 为 (诠释 I = 0; I <[connectionSocketscount];对我有用){
- [[connectionSocketsobjectAtIndex:I]断开];
- }
- isRunning = FALSE;
- }
- }
- - (IBAction)的sendMessage(ID)发送
- {
- 如果([message.textisEqual:@! “” ])
- {
- [听众writeData:[message.textdataUsingEncoding:NSUTF8StringEncoding]
- withTimeout:-1标签:1];
- }
- 其他
- {
- UIAlertView * alertView = [[UIAlertViewalloc] initWithTitle:@ “华林” 消息:@ “请输入消息” 的代表:nilcancelButtonTitle:@ “确定” otherButtonTitles:无,无];
- [alertView秀];
- [alertView发行];
- }
- }
- - (IBAction)textEndEditting:(ID)发送
- {
- [消息resignFirstResponder];
- }
- - (无效)viewDidLoad中
- {
- ReceiveData.editable = NO; //设置TextView的不可以编辑
- 听众= [[AsyncSocketalloc] initWithDelegate:个体经营];
- message.delegate =自我;
- //初始化连接插座的个数
- connectionSockets = [[NSMutableArrayalloc] initWithCapacity:30];
- [selfsendMessage];
- [superviewDidLoad];
- 加载视图,通常从笔尖后//进行任何额外的设置。
- }
- - (BOOL )textFieldShouldReturn:(UITextField的*)文本字段;
- {
- [文本字段resignFirstResponder];
- 返回 YES;
- }
- 的#pragma插座委托
- //连接插座出错时调用
- - (无效)onSocket:(AsyncSocket *)袜子willDisconnectWithError:(NSError *)错误
- {
- 的NSLog(@ “%@” ,[errdescription]);
- }
- //收到新的套接字连接时调用
- - (无效)onSocket:(AsyncSocket *)袜子didAcceptNewSocket:(AsyncSocket *)newSocket
- {
- //将连接服务的客户端记录起来,以便以后实现客户端通信时使用
- [connectionSockets ADDOBJECT:newSocket];
- }
- - (无效)onSocket:(AsyncSocket *)袜子didWriteDataWithTag :( 长)标签
- {
- [袜子readDataWithTimeout:-1tag:0];
- }
- //与服务器建立连接时调用(连接成功)
- - (无效)onSocket:(AsyncSocket *)袜子didConnectToHost:(的NSString *)主机端口:(UINT16)端口
- {
- //这里的主机就是当前进行服务器连接的客户端IP
- 的NSLog(@ “主持人:%@” ,主持人);
- 的NSString * returnMessage = @ “欢迎到插槽测试服务器!” ;
- //将NSString的转换成为NSData的类型
- NSData的数据* = [returnMessagedataUsingEncoding:NSUTF8StringEncoding];
- //向当前连接服务器的客户端发送连接成功信息
- [袜子writeData:数据withTimeout:-1tag:0];
- }
- / **
- *当调用套接字已完成读取请求的数据到内存中。
- *不叫是否有错误。
- 读取客户端发送来的信息(收到插座信息时调用)
- * /
- - (无效)onSocket:(AsyncSocket *)袜子didReadData:(NSData的*)数据withTag :( 长)标签
- {
- 的NSString *味精= [[[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding]自动释放];
- //获取当前发送消息的客户端IP
- //NSLog(@"%@",sock.connectedHost);
- //的NSString * ClientIp = [袜子connectedHost];
- 的NSString * receviceIp =零;
- //从所有连接的客户端当中遍历要接收信息的客户端
- 为(诠释 I = 0; I <[connectionSocketscount],我+ +)
- {
- AsyncSocket * S =(AsyncSocket *)[connectionSocketsobjectAtIndex:I];
- //这里要说明一下,在想另外一个客户端发送信息时需要指定客户端ip地址,所以在发送消息的时候,应该将ip地址一并写在消息里面,然后由服务端进行处理,我这里这是做了一个简单的Demo,有2个客户端相互发送消息
- 如果([sock.connectedHostisEqualToString:@ “10.0.73.252” ])
- {receviceIp = @ “10.0.73.251” ;}
- 其他
- {receviceIp = @ “10.0.73.252” ;}
- 如果([s.connectedHostisEqualToString:receviceIp])
- {
- [第writeData:数据withTimeout:-1标签:0];
- 如果(MSG)
- {
- ReceiveData.text =味精;
- 的NSLog(@ “接收消息:%@” ,MSG);
- }
- 其他
- {
- 的NSLog(@ “错误将接收到的数据转换成UTF-8字符串” );
- }
- }
- 其他
- {
- //如果遍历不存在,则说明客户端为进行连接
- 的NSString * returnMes = @ “对方不在线!” ;
- 的NSData *返回= [returnMesdataUsingEncoding:NSUTF8StringEncoding];
- [袜子writeData:返回withTimeout:-1标签:0];
- }
- }
- }
- - (无效)onSocketDidDisconnect:(AsyncSocket *)袜子
- {
- [connectionSockets REMOVEOBJECT:袜子];
- }
- #PRAGMA结束Deleagte
- - (无效)didReceiveMemoryWarning
- {
- [superdidReceiveMemoryWarning];
- //废弃,可以重新创建任何资源。
- }
- - (无效)的dealloc
- {
- [ReceiveData发布],ReceiveData =零;
- [信息发布],消息=零;
- [听众发行];
- [ReceiveData发行];
- [超级的dealloc];
- }
- @end
客户端代码:
ħ文件
- 的#import <UIKit中/ UIKit.h>
- #进口“AsyncSocket.h”
- @interface的ViewController:的UIViewController <UITextFieldDelegate>
- {
- AsyncSocket *插座;
- }
- @property(保留,非原子)IBOutlet UITextField的*端ClientIPAddress;
- @property(保留,非原子)IBOutlet的UITextView * ReceiveData;
- @property(保留,非原子)IBOutlet的UITextField * SendMessage函数;
- @property(保留,非原子)IBOutlet的UILabel *状态;
- - (IBAction)发送:(ID)发送;
- - (IBAction)ConnectToSever:(ID)发送;
- @end
米文件
- #进口“ViewController.h”
- #进口“的config.h”
- @interface的ViewController()
- @end
- @implementation的ViewController
- - (无效)viewDidLoad中
- {
- _clientIPAddress.delegate =自我;
- [_clientIPAddress setTag:1];
- _SendMessage.delegate =自我;
- [_SendMessage setTag:2];
- _ReceiveData.editable = NO;
- [superviewDidLoad];
- 加载视图,通常从笔尖后//进行任何额外的设置。
- }
- - (无效)textFieldDidBeginEditing:(UITextField的*)文本字段
- {
- 如果([文本字段标签] == 2)
- {
- [自我viewUp];
- }
- }
- - (BOOL )textFieldShouldReturn:(UITextField的*)文本字段;
- {
- [文本字段resignFirstResponder];
- 如果([文本字段标签] == 2)
- {
- [自我viewDown];
- }
- 返回 YES;
- }
- - (BOOL )shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
- {
- returnUIInterfaceOrientationPortrait;
- }
- - (无效)didReceiveMemoryWarning
- {
- [superdidReceiveMemoryWarning];
- //废弃,可以重新创建任何资源。
- }
- - (IBAction)发送:(ID)发送{
- 如果([_ SendMessage.textisEqualToString:@! “” ] && [_ clientIPAddress.textisEqualToString:@! “” ])
- {
- 的NSString *消息= [NSStringstringWithFormat:@ “%@:%@” ,_clientIPAddress.text,_SendMessage.text];
- 如果(插座==无)
- {
- 插座= [[AsyncSocketalloc] initWithDelegate:个体经营];
- }
- //的NSString *量= [消息stringByAppendingString:@“\ r \ n”];
- [插座writeData:[messagedataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1tag:0];
- _ReceiveData.text = [NSStringstringWithFormat:@ “我说:%@” ,_SendMessage.text];
- }
- 其他
- {
- UIAlertView *警报= [[UIAlertViewalloc] initWithTitle:@ “华林” 消息:@ “请输入消息!” 代表:nilcancelButtonTitle:@ “确定”otherButtonTitles:无,无];
- [警报显示];
- [警报发布];
- }
- }
- - (IBAction)ConnectToSever:(ID)发送{
- 如果(插座==无)
- {
- 插座= [[AsyncSocketalloc] initWithDelegate:个体经营];
- NSError *误差=零;
- 如果(![socketconnectToHost:_IP_ADDRESS_V4_onPort:_SERVER_PORT_error:&错误])
- {
- _Status.text = @ “连接服务器失败!” ;
- }
- 其他
- {
- _Status.text = @ “已连接!” ;
- }
- }
- 其他
- {
- _Status.text = @ “已连接!” ;
- }
- }
- 的#pragma AsyncScoket Delagate
- - (无效)onSocket:(AsyncSocket *)袜子didConnectToHost:(的NSString *)主机端口:(UINT16)端口{
- 的NSLog(@ “onSocket:%P didConnectToHost:%@口:%胡” ,袜子,主机,端口);
- [袜子readDataWithTimeout:1tag:0];
- }
- - (无效)onSocket:(AsyncSocket *)袜子didWriteDataWithTag :( 长)标签
- {
- [袜子readDataWithTimeout:-1tag:0];
- }
- - (无效)onSocket:(AsyncSocket *)袜子didReadData:(NSData的*)数据withTag :( 长)标记{
- 的NSString * aStr的= [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];
- self.ReceiveData.text = aStr的;
- [aStr的释放];
- [插座readDataWithTimeout:-1tag:0];
- }
- - (无效)onSocket:(AsyncSocket *)袜子didSecure :( 布尔)标记
- {
- 的NSLog(@ “onSocket:%P didSecure:YES” ,袜子);
- }
- - (无效)onSocket:(AsyncSocket *)袜子willDisconnectWithError:(NSError *)错误
- {
- 的NSLog(@ “onSocket:%P willDisconnectWithError:%@” ,袜子,ERR);
- }
- - (无效)onSocketDidDisconnect:(AsyncSocket *)袜子
- {
- //断开连接了
- 的NSLog(@ “onSocketDidDisconnect:%P” ,袜子);
- 的NSString *味精= @ “很抱歉,这是连接失败” ;
- _Status.text =味精;
- [MSG发布];
- 插座=零;
- }
- - (无效)viewUp
- {
- CGRect帧= self.view.frame;
- frame.origin.y = frame.origin.y-215;
- [UIView的beginAnimations:nilcontext:无];
- [UIView的setAnimationDuration:0.3f];
- [UIView的setAnimationCurve:UIViewAnimationCurveEaseInOut];
- self.view.frame =框架;
- [UIView的commitAnimations];
- }
- - (无效)viewDown
- {
- CGRect帧= self.view.frame;
- frame.origin.y = frame.origin.y + 215;
- [UIView的beginAnimations:nilcontext:无];
- [UIView的setAnimationDuration:0.3f];
- [UIView的setAnimationCurve:UIViewAnimationCurveEaseInOut];
- self.view.frame =框架;
- [UIView的commitAnimations];
- }
- 年底的#pragma代表
- - (无效)的dealloc {
- [_ReceiveData发行];
- [_SendMessage发行];
- [_status发行];
- [_clientIPAddress发行];
- [超级的dealloc];
- }
演示下载地址:客户端下载 服务端下载
0 0
- IOS用封装的API AsyncSocket进行网络通信
- IOS 用封装API AsyncSocket进行网络通信
- IOS 用封装API AsyncSocket进行网络通信
- IOS 用封装API AsyncSocket进行网络通信
- iOS的Asyncsocket进行socket编程
- 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- 46.【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- 【iOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- IOS网络通信 socket第三方库 AsyncSocket(GCDAsyncSocket)
- iOS AsyncSocket封装、长连接
- IOS-使用Asyncsocket进行socket编程
- iOS 基于AsyncSocket的二次开发
- iOS的网络通信
- iOS下AsyncSocket网络库编程
- 赵雅智_Swift(2)_swift常量和变量
- Google's R Style Guide
- ZOJ ——3629 Treasure Hunt IV
- Android完全结束应用程序
- BSS段、数据段、代码段、堆与栈
- IOS用封装的API AsyncSocket进行网络通信
- 今目标,金目标
- 程序 c/c++、Java编写一个统计小程序
- HDOJ 5053 the Sum of Cube
- 微商营销实战技巧分享,轻松月入10W
- 创建一个抽象类A,该类中包含一个求两个数之和抽象方法。创建一个子类B,在B中重写求和方法,且使用方法重载使得
- Android Fragment应用实战,使用碎片向ActivityGroup说再见
- 环形队列的基本运算
- 继承