//

//  ViewController.m

//  UDPDemo

//

//  Created by qianfeng01 on 15-8-13.

//  Copyright (c) 2015年 zg. All rights reserved.

//



#import "ViewController.h"

#import "AsyncUdpSocket.h"

#import "ZCScreenShot.h"

#define STU 1



@interface ViewController ()<AsyncUdpSocketDelegate>

{

    //建立socket

    AsyncUdpSocket *sendSocket;

    AsyncUdpSocket *serverSocket;

    

    //教师端须要一个label,每隔1秒,改变一下数字

    UILabel *numberLabel;

    

    //学生端。须要一个imageView,显示教师端发送过来的数据

    UIImageView *imageView;

    //须要一个宏定义来区分学生端和教师端,一键转换

    

}

@property (nonatomic,strong) NSMutableArray *ipArray;



@end



@implementation ViewController



- (void)viewDidLoad {

    [super viewDidLoad];



    /**

     *  程序分为学生端和教师端。教师端负责对全部接入程序的学生发送截图图片,学生端接受数据的时候。在imageview上显示

      

        学生端程序启动的时候,须要向教师端发送一个数据。也就是签到,这样教师端能够获得学生端的IP地址。进行数据转发

     

        须要的是:截屏函数仅仅对普通的ui有效。可是无法获取到视频截屏,假设要进行视频截屏。须要使用opengl来获取GL的信息,再进行渲染

     */

    self.ipArray = [NSMutableArray arrayWithCapacity:0];

    [self createView];

    [self createSocket];

    

    if (STU) {

        //假设是学生,程序启动向教师端发送一个数据

        [sendSocket sendData:[@"签到!

" dataUsingEncoding:NSUTF8StringEncoding] toHost:@"10.8.155.36" port:5678 withTimeout:-1 tag:100];

    }else{

        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerClick) userInfo:nil repeats:YES];

    }

}



- (void)timerClick{

    

    if (self.ipArray.count == 0) {

        return;

    }

    

    //设置label的背景颜色

    float r = arc4random()%256/255.0;

    float g = arc4random()%256/255.0;

    float b = arc4random()%256/255.0;

    numberLabel.backgroundColor = [UIColor colorWithRed:r green:g blue:b alpha:1];

    numberLabel.text = @"抽烟不?跟我一块儿吧";

    numberLabel.font = [UIFont boldSystemFontOfSize:40];

    

    

    //截取屏幕

    

    //第一个參数是截取图片的范围,第二个參数是截取的那一层

    UIImage *image = [ZCScreenShot beginImageContext:self.view.frame View:self.view];

    

    //遍历转发

    for (NSString *ip in self.ipArray) {

        [sendSocket sendData:UIImageJPEGRepresentation(image, 0.1) toHost:ip port:5678 withTimeout:-1 tag:100];

    }

    

}



- (void)createSocket{

    //不论是学生端。还是教师端,都须要发送和接受,学生端发送一个签到给教师端,教师端发送图片给学生端

    sendSocket = [[AsyncUdpSocket alloc]initWithDelegate:self];

    serverSocket = [[AsyncUdpSocket alloc]initWithDelegate:self];

    

    

    //服务端绑定port

    [serverSocket bindToPort:5678 error:nil];

    //持续观察

    [serverSocket receiveWithTimeout:-1 tag:100];

    

}



- (void)createView{

    if (STU) {

        //学生端

        imageView = [[UIImageView alloc]initWithFrame:self.view.frame];

        [self.view addSubview:imageView];

    }else{

        //教师端

        numberLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 200, 300)];

        numberLabel.center = self.view.center;

        numberLabel.textAlignment =NSTextAlignmentCenter;

        [self.view addSubview:numberLabel];

    }

}





#pragma mark -- AsyncUdpSocketDelegate

-(void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag{

    //发送完毕

}



- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{

    //接受数据

    

    

    //教师端接受学生的ip

    

    //学生端接受教师的图片

    if (STU) {

        if (imageView) {

            imageView.image = [UIImage imageWithData:data];

        }

        imageView.image = [UIImage imageWithData:data];

    }else{

        //记录学生IP,须要一个数组,对新的数据进行追加,对旧的数据忽略

        if (![self.ipArray containsObject:host]) {

            [self.ipArray addObject:host];

        }

    }

    //

    [sock receiveWithTimeout:-1 tag:100];

    return YES;

}

@end

iOS中UDP的使用的更多相关文章

  1. 聊聊iOS中网络编程长连接的那些事

    1.长连接在iOS开发中的应用 常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection.NSURLSession或者是AFNetworking ...

  2. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  3. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  4. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  5. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  6. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  7. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  8. 谈谈iOS中的屏幕方向

    众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...

  9. iOS中assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义  转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...

随机推荐

  1. 为MYSQL加注释--mysql注释符

    上午插入记录的时候一直没有成功,郁闷不知道为什么.因为是很多条记录一起插入,中间一些不用的数据就用"--"来注释了,结果没有效果. 没有办法,在网上找了找,才发现注释符" ...

  2. jsp和java获取文件或路径

    1.如何获得当前文件路径常用:(1).Test.class.getResource("")得到的是当前类FileTest.class文件的URI目录.不包括自己!(2).Test. ...

  3. Sql Server 2005 mdf、ldf文件无法复制问题

    [问题原因]Sql Server服务只要启动就一直占用,故无法进行编辑操作. [解决办法 - 1]: 1)在开始-运行对话框中输入"services.msc”,显示如下界面: 2)关闭如上选 ...

  4. 打造好用的编辑终端环境yakuake

    我喜欢使用vim,由于不喜欢不够纯粹的东西,所以将伪终端打造的和真终端几乎一样,我的yakuake全屏是真的全屏,你也想这样,跟我来吧. 一.修改yakuake的皮肤文件,在/usr/share/ya ...

  5. spring整合jedis时所遇问题

    @Test public void testSpringJedisPool(){ ApplicationContext ac = new ClassPathXmlApplicationContext( ...

  6. JavaScripts广告轮播图以及定时弹出和定时隐藏广告

    轮播图: 函数绑定在body标签内 采用3张图,1.jpg   2.jpg  3.jpg  利用定时任务执行设置图片属性 src  利用for循环可以完成3秒一次 一替换. 定时弹出广告: 由于bod ...

  7. Cryptography I 学习笔记 --- 基于Diffie-Hellman的公钥加密

    1. Diffie-Hellman协议: 假定g是集合G的生成元,G有n个元素. Alice随机选取1-n中的一个数a,并公布ga为公钥 Bob随机选取1-n中的一个数b,并公布gb为公钥 那么gab ...

  8. (8)ftp配置文档

    1.vsftpd文件夹中的ftpusers文件的作用 它是一个黑名单,ftpusers不受任何配制项的影响 该文件存放的是一个禁止访问FTP的用户列表 管理员不希望一些拥有过大权限的帐号(比如root ...

  9. JMeter特殊情况二:针对某些请求数据每次请求都是变化的情况

    概要:某些post请求,例如,登录的请求除了有我们再页面上需要输入的一些值(用户名.密码.是否记住密码等)之外,还有其他的参数,例如token等等,而且这些参数不固定,也就是说每一次post请求这些参 ...

  10. Java NIO.2 使用Files类遍历文件夹

    在以前的Java版本中,如果要遍历某个文件夹下所有的子文件.子文件夹,需要我们自己写递归,很麻烦. 在Java7以后,我们可以NIO.2中的Files工具类来遍历某个文件夹(会自动递归). 大致用法: ...