GCDAsyncUdpSocket Demo

原创 2016年08月29日 16:54:48

#import "ViewController.h"

#import "GCDAsyncUdpSocket.h"


#define STATUS_HEIGHT         20

#define IPHONE_WIDTH         [UIScreen mainScreen].bounds.size.width

#define IPHONE_HEIGHT        ([UIScreen mainScreen].bounds.size.height -([UIApplication sharedApplication].statusBarFrame.size.height - STATUS_HEIGHT))


@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,GCDAsyncUdpSocketDelegate>

{

    UITextField* _ipTextField;

    UITextField* _portTextField;

    UITableView* _logTableView;

    NSMutableArray* _logArr;

    NSMutableArray* _showArr;

    dispatch_queue_t _sendQueue;

    GCDAsyncUdpSocket* _udpSocket;

    NSRecursiveLock* _lock;

    int _index;

}


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    _logArr = [[NSMutableArray alloc] init];

    _showArr = [[NSMutableArray alloc] init];

    _lock = [[NSRecursiveLock alloc] init];

    

    UITextField* ipTextField = [[UITextField alloc] initWithFrame:CGRectMake(20, 40, 160, 30)];

    _ipTextField = ipTextField;

    ipTextField.backgroundColor = [UIColor clearColor];

    ipTextField.borderStyle = UITextBorderStyleLine;

    ipTextField.tintColor = [UIColor blueColor];

    ipTextField.text = @"45.249.244.38";

    ipTextField.font = [UIFont systemFontOfSize:18];

    [self.view addSubview:ipTextField];

    

    UITextField* portTextField = [[UITextField alloc] initWithFrame:CGRectMake(CGRectGetMaxX(ipTextField.frame)+10, 40, 80, 30)];

    _portTextField = portTextField;

    portTextField.backgroundColor = [UIColor clearColor];

    portTextField.borderStyle = UITextBorderStyleLine;

    portTextField.tintColor = [UIColor blueColor];

    portTextField.text = @"15000";

    portTextField.font = [UIFont systemFontOfSize:18];

    [self.view addSubview:portTextField];

    

    UIButton* sendBtn = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(portTextField.frame)+10, 40, 60, 30)];

    sendBtn.backgroundColor = [UIColor orangeColor];

    [sendBtn setTitle:@"send" forState:UIControlStateNormal];

    [sendBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

    [sendBtn addTarget:self action:@selector(udpSend:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:sendBtn];

    

    UITableView* logTableView = [[UITableView alloc] initWithFrame:CGRectMake(20,CGRectGetMaxY(sendBtn.frame)+20, IPHONE_WIDTH-40, IPHONE_HEIGHT - CGRectGetMaxY(sendBtn.frame) - 60) style:UITableViewStylePlain];

    _logTableView = logTableView;

    logTableView.backgroundColor = [UIColor whiteColor];

    logTableView.dataSource = self;

    logTableView.delegate = self;

    logTableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    logTableView.tableFooterView = [[UIView alloc] init];

    [self.view addSubview:logTableView];

    

}


#pragma mark  - udp send

-(void)udpSend:(UIButton*)btn{

    _udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError * error = nil;

    NSString* ip = _ipTextField.text;

    int port = [_portTextField.text intValue];

    [_udpSocket bindToPort:port error:&error];

    if (error) {

        NSLog(@"error:%@",error);

    }else {

        [_udpSocket beginReceiving:&error];

    }

    _index = 0;

    _sendQueue = dispatch_queue_create("udp_send_queue", DISPATCH_QUEUE_SERIAL);

    dispatch_async(_sendQueue, ^(){

        while (true) {

            NSData * sendData = [[NSString stringWithFormat:@"%d",_index] dataUsingEncoding:NSUTF8StringEncoding];

            [_udpSocket sendData:sendData toHost:ip port:port withTimeout:-1 tag:0];

            NSString* str = [NSString stringWithFormat:@"send : %d",_index];

            _index++;

            NSLog(str);

            [self addLog:str];

            [NSThread sleepForTimeInterval:1.0];

            

            if (_index % 5 == 0) {

                dispatch_async(dispatch_get_main_queue(), ^(){

                    [self copyLog];

                    [_logTableView reloadData];

                });

            }

            

        }

    });

}



#pragma mark - GCDAsyncUdpSocket delegate

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag

{

    NSLog(@"发送信息成功");

}


- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error

{

    NSLog(@"发送信息失败");

}


- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext

{

    NSString* recvStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    NSString* saveStr = [NSString stringWithFormat:@"------ recv : %@",recvStr];

    NSLog(saveStr);

    [self addLog:saveStr];

}


- (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError *)error

{

    NSLog(@"udpSocket关闭");

}




#pragma mark - table view delegate

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    

    static NSString *identifierHot = @"udplog";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierHot];

    if(!cell){

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifierHot];

    }

    cell.textLabel.text = _showArr[indexPath.row];

    cell.textLabel.font = [UIFont systemFontOfSize:12];

    cell.backgroundColor = [UIColor clearColor];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;

}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return 1;

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return _showArr.count;

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 14;

}



#pragma mark - arr manage

-(void)addLog:(NSString*)str

{

    [_lock lock];

    [_logArr addObject:str];

    [_lock unlock];

}

-(void)copyLog

{

    [_lock lock];

    [_showArr removeAllObjects];

    [_showArr addObjectsFromArray:_logArr];

    [_lock unlock];

}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


iOS学习笔记4-GCDAsyncUdpSocket的使用(实现异步发送接收数据)

做项目的时候用到了GCDAsyncUdpSocket开源库,所以在此总结下它的用法,作为笔记;GCDAsyncUdpSocket简介GCDAsyncUdpSocket开源类库是以苹果的GCD多任务处理...
  • xiaoluodecai
  • xiaoluodecai
  • 2015年08月02日 15:52
  • 6219

oc下实现局域网udp广播通讯使用开源框架GCDAsyncUdpSocket

UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成[1],提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议...
  • xiaoamani
  • xiaoamani
  • 2014年06月06日 12:36
  • 5621

Socket UDP通信之 AsyncUdpSocket的使用方法及二次封装

下载AsyncSockethttps://github.com/robbiehanson/CocoaAsyncSocket类库,将RunLoop文件夹下的AsyncSocket.h, AsyncSoc...
  • seal82
  • seal82
  • 2016年01月14日 17:31
  • 1773

GCDAsyncUdpSocket的简单使用

GCDAsyncUdpSocket的使用
  • mapleXK
  • mapleXK
  • 2017年04月25日 17:57
  • 2087

oc下实现局域网udp广播通讯使用开源框架GCDAsyncUdpSocket

UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成[1],提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议...
  • xiaoamani
  • xiaoamani
  • 2014年06月06日 12:36
  • 5621

Socket 进行UDP广播数据(GCDAsyncUdpSocket)

在做一个App的时候,有一个需求是服务端在局域网当中发送广播数据,然后连接到此局域网当中的客户端接收到广播数据后,对广播数据做出相应地回复。在这个需求当中广播的唯一的好处就是客户端连接到局域网当中不需...
  • qq_30513483
  • qq_30513483
  • 2016年10月24日 08:36
  • 2912

CocoaAsyncSocket使用笔记之GCDAsyncUdpSocket

先去github的网站下载最新的包,然后先看看介绍。 https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Intro_GCDAsyncSo...
  • zhaojian3513012
  • zhaojian3513012
  • 2015年06月08日 10:29
  • 1242

iOS GCDAsyncUdpSocket UDP 建立连接,实现组播

iOS GCDAsyncUdpSocket UDP 建立连接,实现组播
  • smile_to_lin
  • smile_to_lin
  • 2016年11月29日 13:51
  • 240

极光推送demo测试流程,测试过程中可能遇到的问题和解决方法

创建开发证书,创建描述文件,极光推送页面设置,Xcode工程设置,真机测试 步骤1:创建开发证书 .登陆 https://developer.apple.com进入开发者中心 ...
  • mn704058053
  • mn704058053
  • 2016年06月24日 13:35
  • 8448

UWA官方Demo新增《小米超神》,全面揭秘重度手游的性能表现!

《小米超神》作为一款重度的MOBA手游,它在不同配置的移动设备上,无论是画面表现力,还是性能开销都非常优秀。我们曾公布过该游戏的主要性能数据,当然其出色性能的背后和各方面的细节处理都有着千丝万缕的联系...
  • UWA4D
  • UWA4D
  • 2017年12月25日 13:48
  • 343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCDAsyncUdpSocket Demo
举报原因:
原因补充:

(最多只允许输入30个字)