Socket编程 --- UDP
Socket编程 --- UDP
UDP socket 就是客户端直接发送信息。
demo : 效果图
Socket编程 --- UDP
本例子使用AsyncSocket 第三方开源库
首先 、导入处理网络数据的库 : ,导入方式如图
1_在.h文件中导入 头文件
#import "AsyncUdpSocket.h"
2_创建两个 AsyncUdpSocket 类对象,一个作为接受方(服务端)、一个作为发送方(客户端)
@interface ViewController : UIViewController<AsyncUdpSocketDelegate> { AsyncUdpSocket *recvSocket; AsyncUdpSocket *sendSocket; }
3_界面设置 两个UITextField 一个 UITextView 、一个UIButton 按钮事件,并在xib 中创建相应的控件,相关操作如图所示
@property (retain, nonatomic) IBOutlet UITextField *ipField; @property (retain, nonatomic) IBOutlet UITextField *sendField; @property (retain, nonatomic) IBOutlet UITextView *contentView; - (IBAction)sendText:(id)sender;
二— 切换到 .m 实现文件
1_@synthesize 刚创建的@property 属性
@synthesize ipField;
@synthesize sendField;
@synthesize contentView;
在 方法中将view 上的对象置为空 。
- (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; [self setIpField:nil]; [self setSendField:nil]; [self setContentView:nil]; [super viewDidUnload]; }
在中将view 上的对象release 掉
- (void)dealloc { [ipField release]; [sendField release]; [contentView release]; [super dealloc]; }
///////////////////////////////////// 说了这么多,开始切入正题 //////////////////////////////////////////////////
1—在 方法中实例化创建的两个AsyncUdpSocket 类对象。
调用 initWithDelegate 初始化,并在.h文件中引入代理
recvSocket = [[AsyncUdpSocket alloc]initWithDelegate:self];
sendSocket = [[AsyncUdpSocket alloc]initWithDelegate:self];
分别为创建的两个AsyncUdpSocket 类对象 绑定端口 端口号>5000为妙
// 绑定端口 [recvSocket bindToPort:5888 error:nil]; // 绑定端口 端口应该和接受端 不同 [sendSocket bindToPort:5999 error:nil];
之后服务端(recvSocket) 就可以等待接收数据
// 等待接收数据 [recvSocket receiveWithTimeout:-1 tag:100];
发送数据、按钮触发事件时候发送数据 、调用 sendData:toHost:port:withTimeout:tag (参数解释 sendData : 发送的数据 、toHost :表示客户端的ip地址 , port: 表示服务端的(recvSocket)的端口号 , withTimeout:表示等待的超时时间。tag:表示给其一个标签)
- (IBAction)sendText:(id)sender { NSData *data = [sendField.text dataUsingEncoding:NSUTF8StringEncoding]; [sendSocket sendData:data toHost:ipField.text port:5888 withTimeout:60 tag:100]; //什么时候发送成功 }
think:: 客户端 (sendSocket )什么时候发送数据成功?调用 didSendDataWithTag:方法表示发送数据成功
// 调用这个方法表示发送成功 - (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag { if (tag == 100) NSLog(@"yes"); else NSLog(@"no"); }
think ::: 服务端(recvSocket) 什么时候接受到了数据呢? 调用didReceiveData 表示服务端接收到了数据,当接受到数据后,仍需调用
receiveWithTimeout这个方法 ,表示等待接收数据.
// 调用这个方法表示接受到了 数据 - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port { NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]autorelease];
//host 表示ip地址。
contentView.text = [NSString stringWithFormat:@"%@\n%@:%@",contentView.text,host,str];
// receiveWithTimeout:-1 表示一直等待!
[recvSocket receiveWithTimeout:-1 tag:100]; return YES; }