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; }

 

 

posted @ 2013-01-31 11:55  Jere-Jobs  阅读(667)  评论(0编辑  收藏  举报