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


相关文章推荐

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

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

GCDAsyncUdpSocket的简单使用

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

Socket 进行UDP广播数据(GCDAsyncUdpSocket)

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

CocoaAsyncSocket使用笔记之GCDAsyncUdpSocket

先去github的网站下载最新的包,然后先看看介绍。 https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Intro_GCDAsyncSo...

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

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

安卓友盟分享集成微信QQ微博分享demo精简版

最近做项目用到了分享功能,介于友盟的全家桶,于是放弃shareSDK,选择友盟,虽然是完全按照友盟集成文档来做的,但是总是有些不顺畅,不能一下就搞定,这里记录一下过程,与遇到的坑 1.项目准备工作 ...

u3d做自己的第一个射击游戏demo,实现开火效果和跟随鼠标朝向

233

一个简易的区块链demo

别人写的python版本python版本源码地址:https://github.com/dvf/blockchain#installation环境准备我使用的是ubuntu 16.04,其它linux...

轻量级通信引擎StriveEngine —— C/S通信demo(附源码)

转载自:http://www.cnblogs.com/zhuweisky/p/3139801.html 参考地址:http://www.cnblogs.com/youfenglaiyi/p/5141...

微信小程序Demo组件大全(对话框、指示器、五星评分,画廊,影院座位……

微信小程序 - 自定义组件预览 用微信web开发者工具打开src目录(请注意,是src目录,不是整个项目) 使用 组件的wxml结构请看src/components/下的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCDAsyncUdpSocket Demo
举报原因:
原因补充:

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