2018-01-08 MD5加密介绍、C# 网口传输总结、Asp.Net底层解析-runat="server"、iOS开发:后台运行、匿名类型

第一组:刘聪 MD5加密介绍

1. MD5介绍

MD5全名Message Digest Algorithm 5 ,5是一种信息摘要算法,主要是通过特定的哈希散列方法将文本信息转换成简短的信息摘要,而且是绝对不可逆的。MD5具有很好的安全性,广泛的应用于登陆验证和数字证书。

2. C# MD5加密解密用于登录验证

引用:using System.Security.Cryptography;

  • 加密:创建MD5对象,调用其ComputeHash()方法生成字节流,转化成字符串并返回。
  • 解密: 由于MD5是不可逆的,所以加密之后就无法解密,取用password时候,需要加密输入的数据,再与数据库中已加密的数据进行比对。如果比对结果一致,则可以判定密码正确。
2018-01-08 MD5加密介绍、C# 网口传输总结、Asp.Net底层解析-runat=

第二组:冯佳丽 C# 网口传输总结

IPAddress localaddr = IPAddress.Parse(ip_value.Text);//端口号
int port_data;
port_data = Convert.ToInt32(port_value.Text);
IPEndPoint enhost = new IPEndPoint(localaddr, port_data);
private static Socket s = null;
//连接以太网
try
{
    s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    s.Connect(enhost);
}
catch (Exception ex)
{
    //连接失败
    MessageBox.Show("connect fail! " + ex.Message);
    test.IsEnabled = false;
    check ++;
    check %= 2;
    connect.Content = "连接";
}
finally
{
    //连接成功
    if (check % 2 == 0)
    {
        connect.Content = "断开";
        test.IsEnabled = true;
    }
}
//断开以太网
try
{
    s.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    test.IsEnabled = false;
    connect.Content = "连接";
    //显示清空
    speed.Text = "";
}
send_byte[0] = (Byte)'t';
send_byte[1] = (Byte)'e';
send_byte[2] = (Byte)'s';
send_byte[3] = (Byte)'t';
//发送命令
s.Send(send_byte, send_byte.Length, SocketFlags.None);
//接收数据
out_string = "";
bytes = s.Receive(recv_byte, recv_byte.Length, SocketFlags.None);
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
//时间计数
stopwatch.Start();
stopwatch.Stop();
TimeSpan timespan = stopwatch.Elapsed;
double ms = timespan.TotalMilliseconds;
//多线程
Thread tfer;
tfer = new Thread(new ThreadStart(BeginTransfer));//BeginTransfer为一方法名
tfer.IsBackground = true;
tfer.Priority = ThreadPriority.Highest;
tfer.Start();
//在副线程中调用主线程的函数
this.Dispatcher.Invoke(end);

if (tfer.IsAlive)
{
    tfer.Abort();
    tfer.Join();
    tfer = null;
}
//写文件
string Filepath = "C:\\Users\\Administrator\\Desktop" + "\\" + "test.txt";
FileStream fs;
fs = new FileStream(Filepath, FileMode.Create);
fs.Position = fs.Length;
fs.Write(recv_byte, 0, bytes);
fs.Flush();
fs.Close();

第三组:蔡永坚Asp.Net底层解析-runat="server"

简单描述的话就是:ASP.NET将有runat=”server”标志的标签当作服务器控件,这些标签会被初始化成各个服务器控件的实例添加到Page的服务器控件树中,参与页面生命周期直至Render成浏览器可识别的html编码。

VSS的Web项目中专门安排了一个文件存放这些服务器控件的声明,如下图所示,[页面名称].aspx.designer.cs就是VSS自动生成的,它与[页面名称].aspx.cs文件以Partial的形式构成了该页面的后台类定义。

页面WebForm1.aspx的前台代码为:

[html] view plain copy
  
      
      
  

而WebForm1.aspx.designer.cs内自动生成的代码如下:

[csharp] view plain copy
public partial class WebForm1 {  
    protected global::System.Web.UI.WebControls.Label asplbl_Test;  
    protected global::System.Web.UI.HtmlControls.HtmlInputFile file_test;  
}  

VS自动为添加有runat="server"标志的标签找到对应的服务器控件类,并在designer.cs文件中声明全局变量,这样一来,所有添加有runat="server"标志就能够通过后台代码进行控制。

服务器控件大体上可以分为两大类,一类是HtmlControls(System.Web.UI.HtmlControls命名控件下的大部分类),一类是WebControls(命名空间System.Web.UI.WebControls下的类是ASP.NET自带的,用户可以自定义该类型服务器控件)。

HtmlControls相对来说理解起来比较简单,他们的基类都是HtmlControl类,而HtmlControl类继承Control类。HtmlControls中的控件都对应HTML标签的某一种,也就是说,这些HtmlControl控件是为各个HTML标签量身定做的,目的是为了在给某个HTML标签添加runat=”server”标志后,页面后台就能够为其自动生成相对应的HtmlControl服务器控件,从而在后台进行操控,如Form会转化为HtmlForm控件、Input转化为HtmlInputButton控件、Span转化为HtmlGenericControl控件等等(顺便提一句,那些没有什么“特色”的标签都会转化为HtmlGenericControl控件,像Span、Label、Div等等,一般只会到InnerHTML、Attributes等所有HTML标签共有的属性)。

WebControls则可看成是自定义控件,与HtmlControl不同的是,WebControl并不会仅限于生成某个特定Html标签,为了达到某种“组合效果”,WebControl最终会Render成多个Html标签,这些Html标签“相互配合”达到特定封装的效果。

总结来说,如果在ASPX页面上的标准Html标签加上runat=”server”标志后,ASP.NET就会自动创建对应HtmlControl控件类型的全局变量,从而能够在后台对其进行控制;如果在非标准Html标签中添加runat=”server”标志(一般都会这么做,否则不会被服务器解析而直接返回,这将导致浏览器服务识别),ASP.NET会试图根据Web.Config中关于服务器控件名称的设定找到对应的类型,并创建一个该类型的全局变量。


第四组:张元一 iOS开发:后台运行以及保持程序在后台长时间运行

EFB项目中,需要实现后台持续监控电量的功能,这可以拆分为三个需求:

  1. 程序需要保持在后台可以运行。
  2. 程序需要获取ipad精确电量。
  3. 需要每隔一段时间扫描一次电量,以获取当前有效的电量。

本文先讨论需求一的实现:

  1. iOS 应用程序5个状态:
    停止运行-应用程序已经终止,或者还未启动。
    不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。
    活动-app处于“使用中”的状态。
    后台-app不再屏幕上显示,但它仍然执行代码。
    挂起-app仍然驻留内存但不再执行代码。
    按下Home键时,app从活动状态转入后台,绝大部分app通常在几秒内就从后台变成了挂起。
    在内存吃紧的时候,iphone会首先关闭那些挂起的app。
    从 iOS 4 开始,应用就可以在退到后台后,继续运行一小段时间(10 分钟);

  2. 把自己声明为需要在后台运行,就能不限时地运行了。
    不过限制为播放音乐、使用 GPS 、voip、。 值得一提的是,有的应用为了达到后台不限时运行的目的,在后台播放无声的音乐。

综上,考虑使用后台持续播放音乐的方式来实现。实现代码如下:

#pragma mark - 程序将要进入后台(墓碑状态)
- (void)applicationWillResignActive:(UIApplication *)application {
}
#pragma mark - 程序进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application {
    
    [UIDevice currentDevice].batteryMonitoringEnabled = YES;
    ///***
    //设置永久后台运行
    UIApplication *app = [UIApplication sharedApplication];
    __block   UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        //不管有没有完成,结束bgTask任务
        [application endBackgroundTask:bgTask];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });
    
    //开启后台任务
    [self applyBackgrounTaskTime];

 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       // NSLog(@"Starting background task with %0.1f seconds remaining", application.backgroundTimeRemaining);
       
        [NSThread sleepForTimeInterval:600];
       // NSLog(@"Finishing background task with %0.1f seconds remaining", application.backgroundTimeRemaining);
        
        //告诉系统我们完成了 也就是要告诉应用程序:“好借好还”嘛。
        //将任务标记为完成
        [application endBackgroundTask:bgTask];
        // 销毁后台任务标识符
        bgTask = UIBackgroundTaskInvalid;
    });
    
    //开启定时器 不断向系统请求后台任务执行的时间
    [self.timer fire];
}
//开启后台任务
- (void)applyBackgrounTaskTime
{
    //__block UIBackgroundTaskIdentifier background_task;
    UIApplication *application = [UIApplication sharedApplication];
    //注册一个后台任务,告诉系统我们需要向系统借一些事件
    self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^ {
        
        //不管有没有完成,结束background_task任务
        [application endBackgroundTask: self.bgTask];
        self.bgTask = UIBackgroundTaskInvalid;
    }];
    
    //异步
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        //### background task starts
        NSLog(@"Running in the background\n");
        
        //循环播放无声的MP3
        [self backGroundStart];
        
        [NSThread sleepForTimeInterval:2];
        //结束background_task任务
        [application endBackgroundTask: self.bgTask];
        self.bgTask = UIBackgroundTaskInvalid;
    });
}
//播放MP3
- (void)backGroundStart
{
    //AVAudioPlayer
    //查找本地音乐文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"莫扎特-第3号法国号协奏曲" ofType:@"mp3"];
    
    //构建URL
    NSURL *url2 = [NSURL fileURLWithPath:filePath];
    
    //创建音乐播放器
    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url2 error:nil];
    //根据URL地址来读取音乐文件(写在ViewDidLoad中会自动播放)
    [_audioPlayer prepareToPlay];
    _audioPlayer.numberOfLoops = -1;//循环
    _audioPlayer.delegate = self;
    [_audioPlayer play];   
}

本项目demo的GitHub地址:
https://github.com/Frued/BatteryLevel


第五组:陈孚楠 匿名类型

创建一个对象,一定要先定义这个对象的类型吗?不一定的!来看看这段代码。

var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam = new int[] { 1, 2, 3, 4 } };
Console.WriteLine(obj.Empty);//另一个对象的属性名字,被原封不动的拷贝到匿名对象中来了。
Console.WriteLine(obj.myTitle);
Console.ReadKey();

new关键字之后就直接为对象定义了属性,并且为这些属性赋值。而且,对象创建出来之后,在创建对象的方法中,还可以畅通无阻的访问对象的属性

当把一个对象的属性拷贝到匿名对象中时,可以不用显示的指定属性的名字,这时原始属性的名字会被“拷贝”到匿名对象中

注意:  
如果你监视变量obj,你会发现,obj的类型是Anonymous Type类型的

不要试图在创建匿名对象的方法外面去访问对象的属性!

优点:
这个特性在网站开发中,序列化和反序列化JSON对象时很有用!

你可能感兴趣的:(2018-01-08 MD5加密介绍、C# 网口传输总结、Asp.Net底层解析-runat="server"、iOS开发:后台运行、匿名类型)