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时候,需要加密输入的数据,再与数据库中已加密的数据进行比对。如果比对结果一致,则可以判定密码正确。

第二组:冯佳丽 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
<body>  
    <asp:Label ID="asplbl_Test" runat="server" Text="Test"></asp:Label>  
    <input type="file" id="file_test" runat="server" />  
</body>  

而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对象时很有用!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 我轻抬起我的草帽,看着不远处的杜府,心下盘算着该怎样进去。 次日,我一身破旧,满脸灰尘,摔倒在杜府公子的马车前。驾...
    三日初醒阅读 1,730评论 45 70
  • 她来了又走了,也就十八个小时,而我却等了两年。 你知道这样的感觉么?一个梦反反复复做了几百次,每个细节你都熟...
    灼骨阅读 184评论 0 0