zoukankan      html  css  js  c++  java
  • iOS中UDP的使用

    //
    //  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

























  • 相关阅读:
    第一篇:GCD的使用
    第一篇:线程的安全
    内存问题
    第一篇:多线程的概念
    第一篇:NSOperation的概念
    存储问题
    第一篇:NSTread线程的创建
    第一篇:多线程使用
    遍历所有表,取每个表的MAXID更新到ID控制表
    <转载>SQL查询数据库各表所占空间
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6815951.html
Copyright © 2011-2022 走看看