• 06 ASP.net


    ASP.net

    第一天

    1. 理解浏览器与服务器概念,与WinForm的区别。

    C# IIS(Internet Information Service)

          互联网信息服务

    Java(Tomcat)

    Php(Apache)

    请求处理:

    什么是HTTP协议?

    一个基于应用层的通信规范

    浏览器和服务器的底层通信——Socket

    浏览器就是一个Socket客户端

     

    浏览器的本质作用

     

    1.将用户输入的URL封装为一个请求报文,

    2.建立与服务器端的连接,

    3.将封装好的请求报文通过socket发送到服务器端,

    server.write(JSON.stringify(send));

    4.接收到服务端返回的响应报文,

    5.解析响应报文JSON.parse,

    6.渲染内容到页面当中 console.log(msg)。

     

     

    如果页面中含有图片,那么浏览器渲染从服务器返回的代码时(Html),会遇到<img>标签,那么浏览器会重新发送请求,从浏览器下载该图片。

     

    TCP

    打电话:

    转换成模拟信号 再转回来

     

    网络传输:

    底层是tcp,上面是http 浏览器与服务器之间用http通信,交换机什么的用到tcp 再最后转回来

     

    静态网站 HTML+CSS+JS 前端

    动态网站 C# 服务端

     

    .ashx

    如果浏览器向服务器请求的静态资源(.html,.css,.js)

    那么IIS服务器直接找到这些资源返回,因为浏览器认识,如果请求是动态资源IIS处理不了,

    他一看是ashx,处理不了,只能交给.netFrameWork来处理

    (是通过aspnet_isapi.dll交给.NetFrameWork来处理)

    最后.NetFrameWork交给IIS,IIS再返回给浏览器

    托管代码与非托管代码

    托管代码调用.Net Framework来执行,非托管代码调用的是Windows系统库和MFC库

    aspnet_isapi.dll无法反编译,因为它是非托管代码。

    扩展程序注册在命令: aspnet_regiis –i

     

    教程中是怎么创建的。

    新建——空项目——web应用程序(空) 右键添加新建项HTML 右键添加ashx

    新建一个UserList.html再新建一个UserInfoList.ashx:

     

    aspx

    webForm

     

    上面写html,下面可以写C#

    微软希望网页开发能像Winform开发一样简单。

    请求报文: 

    响应报文:

     

    HTTP协议内容是:

    上图画的不是特别准确(懒得改了)

     

    HTTP请求:

    请求行+请求头+请求体

     

     

    HTTP响应:

    一个简单的表单示例

    HttpRequestDemo.html

     

    Accept.ashx

    get请求

    1.如果是post方式进行请求,那么表单中的数据会放在请求报文体中,发送到服务器端,如果以get方式进行请求,那么表单中的数据会放在URL地址栏中发送到服务端.(注意,表单元素必须有name属性)

     

    1. 在服务端接收方式 不一样,如果是post请求用request.Form如果是get请求,用request.queryString.

     

    1. Post请求比get请求安全,以后像注册,登录等表单都要用post提交.
    1. Post请求发送的数据要比get请求要大。

     

     

    只能将表单元素的value值提交到服务端(span,div等不熟悉表单元素,所以无法提交),并且表单元素必须要加name属性

     

     

     

    http协议的无状态特性,第二次请求不会拿到第一次请求的结果。

     

    静态变量,一直存在内存中,把服务终止了才会取消。

    public static int count = 0;

     

    自增

     

    int.parse()与convert.toint32()

     

    int.parse(null) 抛出异常

    convert.toint32(null)  =  0

    连接数据库读取表格

     

    UserInfoList.html

    UserInfoList.ashx

     

    第二天

     

    复习:

    1.如果是post方式进行请求,那么表单中的数据会放在请求报文体中,发送到数据端,如果以get方式进行请求,那么表单中的数据会放在url地址栏中发送到服务端。(注意,表单元素必须有name属性)

     

    2.在服务端接收方式不一样,如果post请求用request.Form,get请求用request.QueryString.

     

    3.Post请求比Get请求安全,以后像注册,登录等表单都要用post提交

     

    4.Post请求发送的数据要比get请求大。

     

    注意:只能将表单元素的value值提交到服务端(span,div等不熟悉表单元素,所以无法提交),并且表单元素必须要加name属性。

     

    继续完成了第一天任务未完成的 增删改查 其余部分。

    (这里省略)

     

    请求处理模型:

     

    Kernal:操作系统内核

     

    服务器:

     

    操作系统:

    Windows Server 2008

    内核模式:

    操作系统操作在内核模式下

    用户模式:

    应用软件操作在用户模式下。

     

    KernalModeDriver:

    http.sys

     

    请求先到达服务器操作系统的内核模式。

    交给http.sys---->对浏览器发送过来的数据做个基本的处理,

    检查端口号等。将处理的结果转交给IIS

     

    IIS是一个软件,工作在用户模式下。

    对发送过来的请求进行判断,如果是静态资源(.html,.js,.css等)

    直接找到这些资源后返回给浏览器。如果是动态资源,处理不了

    交给aspnet_isapi.dll

     

    工作进程.w3wp.exe

    非托管模式:aspnet_isapi.dll ,加载.net framework

    托管模式:.net framework

     

    Web网站与Web应用程序的区别

     

     

    (“项目”与”网站”)

     

    “项目”中是先编译生成,如果有一个ashx有问题就不能打开了

     

    而”网站”是可以单独访问编译

    网站是请求编译,每个ashx单独生成一个DLL

     

       context.Response.Write(System.Reflection.Assembly.GetExecutingAssembly().Location);

     

    所以,网站一般都用WebApplication项目

     

    域名与DNS(域名解析)

    将域名转换成IP地址 ping www.baidu.com

     

    一般处理程序手写三层(增删改查小项目)

     

    第一节课:三层列表展示

    再写一遍SqlHelper:

     

    SqlHelper.cs

    UserInfoDal.cs

    最后运行

     

     

    总结一下这个分层的项目:

     

    第一步、首先建立这个解决方案,生成一些项目

    BLL层 BusinessLogicLayer 业务逻辑层

    DAL层 DataAccessLayer数据访问层

    Model层 数据层

    WebApp 是空白的Asp.net web应用程序

    Common公用的小工具库(没用到)

     

    第二步、在WebApp中配置web.config

    第三步、写Model层(数据转对象)

     

    UserInfo.cs:

    第四步、写数据访问层DAL

    中的SqlHelper.cs

     

    写DAL业务逻辑层中的UserInfoDal.cs

    第五步、写业务逻辑层BLL

    第六步、在web项目中

    UserInfoList.html:

    UserInfoList.ashx:

    第二节课:数据层构建完成(完善数据层)

    UserInfoDal.cs

    第三节课:三层详细展示(完善业务层)

     

    添加 ShowDetail.html和ShowDetail.ashx

    ShowDetail.html

    ShowDetail.ashx:

     

    工厂模式

     

    //问题:业务层与数据层紧耦合

    如果我写了一个CZBK.TestProject.AccessDAL类库,

    那么在BLL层也要对应改好多东西

    怎么解决呢,需要写一个数据层的访问接口:

    添加Model引用

    在DAL中引用IDAL接口

     

    在UserInfoDal.cs中实现这些接口

     

    改变业务层

     

    业务层添加引用

     

    重写

    新建工厂:

    添加引用:

    写代码:

    这时候原先的业务层也需要对应有改变

    添加引用

    写代码:(此时业务层和数据层完全解耦了)

    *抽象工厂

    修改config文件 而不是在vs里写class重新生成

    总结: 工厂类=>生产对象

    返回一个接口,因为

    不管是SQLSERVERDal还是AccessDal 都实现这个接口

     

    第三天

     

    1. 三层添加,删除,修改数据(修改部分数据)
    2. 文件上传
    3. Response.Redirect原理
    4. 一般画图 GDI+
    5. 创建图片水印
    6. 缩略图
    7. 验证码
    8. 文件下载
    9. WebForm简介列表,添加(IsPostBack原理),删除

    上传图片 Enctype

    <!—enctype = “multipart/form-data”:如果上传文件时必须添加该属性,将文件内容作为请求报文体一部分à

     

    enctype的默认取值是 application/x-www-form-urlencoded

     

    表单里如果有文件上传域必须要加enctype。

    FileUpload.html

    FileUpload.ashx

     

    public void ProcessRequest(HttpContext context)

            {

                context.Response.ContentType = "text/html";

                HttpPostedFile file = context.Request.Files["fileUp"];//接收文件数据

     

                if (file == null)

                {

                   context.Response.Write("请选择文件");

                }

                else

                {

                    //判断上传的文件的类型

                    string fileName = Path.GetFileName(file.FileName);//获取文件名与扩展名

                    string fileExt = Path.GetExtension(fileName);//获取扩展名

     

     

     

                    if (fileExt == ".jpg"||fileExt == ".gif")//获取扩展名

                    {

                        file.SaveAs(context.Request.MapPath("/ImagePath/"+fileName));//保存文件

     

                        context.Response.Write("<html><head></head><body><img src='/ImagePath/"+ fileName +"'></body></html>");

                    }

                    else

                    {

                        context.Response.Write("文件类型错误");

                    }

                }

            }

     

     

    public void ProcessRequest(HttpContext context)

            {

                context.Response.ContentType = "text/html";

                HttpPostedFile file = context.Request.Files["fileUp"];//接收文件数据

     

                if (file == null)

                {

                   context.Response.Write("请选择文件");

                }

                else

                {

                    //判断上传的文件的类型

                    string fileName = Path.GetFileName(file.FileName);//获取文件名与扩展名

                    string fileExt = Path.GetExtension(fileName);//获取扩展名

     

     

     

                    if (fileExt == ".jpg"||fileExt == ".gif")//获取扩展名

                    {

                        string dir = "/ImagePath/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/"   

                            + DateTime.Now.Day + "/";

                       

                        //创建文件夹

                      

                        Directory.CreateDirectory(Path.GetDirectoryName(context.Request.MapPath(dir)));

     

                        string newfileName = Guid.NewGuid().ToString();

     

                        string fullDir = dir + newfileName + fileExt;//构建完整的文件路径

     

                        file.SaveAs(context.Request.MapPath(fullDir));

     

                        //file.SaveAs(context.Request.MapPath("/ImagePath/"+fileName));//保存文件

                   

                        context.Response.Write("<html><head></head><body><img src='"+ fullDir +"'></body></html>");

                       

                        //最后再将上传成功的图片路径存储到数据库,

                    }

                    else

                    {

                        context.Response.Write("文件类型错误");

                    }

                }

            }

     

    GDI绘图

    压缩图片

            public void ProcessRequest(HttpContext context)

            {

                context.Response.ContentType = "text/plain";

                string filePath = context.Request.MapPath("/ImagePath/OctoCat.jpg");

     

                using (Bitmap map = new Bitmap(40, 40))

                {

                    using (Graphics g = Graphics.FromImage(map))

                    {

                        using (Image image = Image.FromFile(filePath))

                        {

                            g.DrawImage(image,new Rectangle(0,0,map.Width,map.Height));

                            string fileName = Guid.NewGuid().ToString();

                            map.Save(context.Request.MapPath("/ImagePath/" + fileName + ".jpg"),System.Drawing.Imaging.ImageFormat.Jpeg);

                        }

                    }

                }

            }

    使用集成的插值库加速:

    验证码

    这里略过

     

    重定向过程

     

    Context.Response.Redirect(“xxx.ashx”)

     

    302重定向

    重定向是两个请求,第一个请求后 服务端的响应报文里返回了一个特殊指令—302重定向指令。

    文件下载

     

     

    WebForm简介

     

    一般处理程序 ashx不涉及复杂的页面的时候还可以,涉及到复杂页面的时候就太麻烦了,这时候微软给我们提供了一个 webform

     

    AutoEventWireUp

    IsPostBack分析

     

     

    第四天

     

     

    webform技术

    … …

     

     

    Request其他成员

    可以用来做防盗链等其他的东西。

    Response成员:

     

    Response.Buffer设置为true以后,

    Thread.Sleep(2000)

    Response.write不会立刻输出,而是会等一会儿

     

    ViewState使用与原理

    无状态的根本原因是,浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。

    应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。

     

    一个浏览器发出的请求都是由实现了IHttpHandler接口的对象进行相应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量中早就不存在,因此不要将状态信息保存到类中

     

     

    ViewState是一个键值对

    Server成员:

    Server属性

     

    Server属性是HttpServerUtility的一个实例,它提供对服务器上的方法和属性的访问。

     

    Server对象

     

    Server.MapPath();

     

    Server.Execute(“../NewList.aspx”);

    在一个页面中执行另一个页面,

     

    类似于iframe

    iframe不利于SEO优化。

     

    Server.Transfer(“../NewList.aspx”);

    excute差不多,但是URL是后者。

    Redirect是先返回一个302,再发过去,

    Transfer是直接跳转了。

     

    HtmlEncode

     

     

     

    HtmlDecode

     

     

    关闭请求验证:

    第五天

    Cookie介绍

     

    1. 请求处理过程

    Url重写:伪静态

    aaa.aspx?a==11-àaaa_111.aspx

    1. Cookie

    cookie:一小段文本,明文。存储在客户端的浏览器内存里面或者磁盘。cookie是跟网站相关。百度可以往客户端写cookie,sina也可以写cookie,但是百度只能读取跟百度网站相关的cookie。

    cookie会随着请求网站一块发送到后台【如果请求百度的时候,那么酒吧百度的cookie放到请求报文里面去,然后发送到后台。】

     

    cookie可以设置一个Path来限制某个路径下面的页面+会把cookie发送到后台。

    比如:请求图片,请求一个css、js,为了提高性能,可以通过path设置页面的所在路径,控制cookie的发送。

     

    Cookie的域:浏览器往后台发送数据时候,要把cookie放到请求报文里面去,发送到后台,那么有个问题:请求是子域的网页,那么主域的cookie会不会发送到后台呢?

    答案:是的。一块发送。如果请求时主域页面,子域的cookie时不会发送到后台的。

    如果子域想让请求主域页面的时候也一块发送到后台,设置当前Cookie的域为主域就可以了。

     

    cookie时通过响应报文的方式写到前台。最终写入Cookie时通过响应报文头来的

    cookie有限制(大多数浏览器)

     

    【response.cookie】

     

     

    请求处理模型3

    Cookie文档分析

     

    回顾

    IIS请求流程:

     

    第六天

     

        复习请求处理过程

     

    JSON简介

     

    第七天

     

    第八天

    Cache

     

     

    自定义缓存:

    依赖项:数据库改变后通过通知缓存,来更改销毁缓存。

    页面缓存(一般给网站首页做)

    数据源缓存(依赖于Webform中的一个控件,了解,并没有什么卵用)

     

    文件缓存依赖

    监视文件是否有变化,然后进行操作

     

    进程外Session

    应对集群时在不同的服务器上Session的存储的问题

     

    数据库缓存依赖

    监视数据库中的表是否有变化,然后进行操作

    ajax控件

     

    错误页配置与网站发布

    网站发布NTFS(FAT32)

    右键、发布。 这样会生成DLL,更安全,就不会被看到源代码了。

    发布完后打开IIS部署网站。

     

    在IIS上修改404页面也可以。

     

    HttpModule

     

    Global文件

    //在线人数统计

    最后一天

    复习

    Application对象

    Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动创建,直到没有一个网页被访问时结束,Application对象被自动撤销。因此Application对象中的变量也有相同生存期,并且变量可以被Web应用程序中的所有网页访问。因此,可以在Application对象中建立一些全局的公用变量,由于存储在Application对象中的数值可以被应用程序的所有网页读取,所以Application对象的属性也适合在应用程序的网页之间传递信息。

    Application对象主要有以下用途:

    1. l 存储记录在线人数或访问网站总人数的变量。
    1. l 存储网站共用最新消息,供所有网页更新。
    2. l 记录网站中个网页同一条广告被点击的次数或时间。
    3. l 存储供所有网页使用的数据库数据。
    4. l 不同用之间通讯,例如多用户聊天室,多用户游戏等

    关于 ASP.NET 的 Application 的用法,与 Session 非常不同。下面来看看详细的介绍:

    Session的用法

    一、Session.Add 名称相同时,不会重复,而是覆盖。

    ?

    1

    2

    3

    Session.Add("s1", 1);

    Session.Add("s1", 2);

    // s1 最终只有一个值,就是 2。

    二、名称忽略大小写。

    ?

    1

    2

    Session.Add("s1", 1);

    Response.Write(Session["S1"]); // 值为 1

    三、Session Add 后立刻就可取到值(Remove 同理),这点不同于 CookieCookie 要等到下个页面才有。

    ?

    1

    2

    Session.Add("s1", 1);

    Response.Write(Session["s1"] == null); // False,它不为 null

    四、存储的 Session 数据类型为 object,最好用 Convert 转换。

    ?

    1

    Convert.ToInt32(Session["s1"]);

    如果转换为 string 最好用 Convert.ToString(),而不是 Session["s1"].ToString(),因为如果 Session 为 null,用后法就会报错。

    五、在类中使用 Session

    ?

    1

    System.Web.HttpContext.Current.Session

    Application 的用法

    名称重复问题

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    HttpContext.Current.Application.Add("key1", "value1");

    HttpContext.Current.Application.Add("key2", "value2");

    HttpContext.Current.Application.Add("KEY2", "value3"); // name 忽略大小写

    int count = HttpContext.Current.Application.Count; // 3

    string[] keys = return HttpContext.Current.Application.AllKeys; // key1、key2、key2

    string s = (string)HttpContext.Current.Application.Get("key2"); // value2

    string s2 = (string)HttpContext.Current.Application.Get(2); // value3

    如上代码,结果我们在备注中列出了。可以看出 Application 遇到键值相同,它既不报错,也不覆盖之前的,而是同时存在。用键值名称去取值时,取到的是同名中第一个对应的值。如果非要取后面的,就用 index。

    如果我们要遇相同 name,就覆盖,可用下面的代码

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    HttpContext.Current.Application.Add("key1", "value1");

    // HttpContext.Current.Application.Add("key2", "value2");

    string name = "key2";

    object obj = HttpContext.Current.Application.Get(name);

    if (obj == null)

    {

     // 不存在,直接添加

     HttpContext.Current.Application.Add(name, "value2");

    }

    else

    {

     // 存在,不能直接调用 Add 方法,这样会造成两个相同 name 的条目

     // obj = "value3"; // 这种方法行不通

     HttpContext.Current.Application[name] = "value3";

    }

    return (string)HttpContext.Current.Application[name]; // 用 [] 取值时,等同于 Get 方法

    上面代码中,直接修改 obj 是行不通的,但是遇到对象的话,如下代码是行得通的。说明:这是 C# 值引用、地址引用的知识点,与 Application 无关。

    ?

    1

    ((Site)obj).Url = "222"; // 行得通

     

     

     

    委托与文件流复习

     

    聊天程序(基于Socket,Thread)

     

    简单回顾委托

     

    ·什么是委托?(安全的函数指针)

    通俗:就是一个能存放符合某种格式(方法签名)的方法的指针的清单。

     

    指针指向内存的地址,安全的函数指针是指—不会指向操作系统的内存地址。(和C语言中的指针不太一样)。

     

    ·委托创建方式

    准备一个方法: string Hello U(string uName) (//方法代码)

    声明委托:     delegate 返回值类型 委托类型名(参数)

    例子:     delegate string DGSayHi(string uName);

    创建委托对象: DGSayHi dgSay = new DGSayHi(HelloU);

           或者: DGSayHi dgSay = HelloU;

     

    追加方法: dgSay += HelloU2//Delegate. Combine(,)

    删除方法: dgSay -+ HelloU3

     

    ·委托调用方法

    dgSay(“binggo”), //dgSay.Invoke(“binggo”)

     

    ·委托和事件的关系。

    委托是一个类。

    事件是一个对象。

     

    事件是委托的一个实例

     事件是安全的,委托是不安全的。

     因为委托是一个类,事件是一个对象,所以事件只能在代码内进行调用,而委托不能。

     

     文件流 FileStream

     

     string filePath = openfile.FileName;

     using(FileStream fileStream = new FileStream(filePath,FileMode.Open,FileAccess.Read))

    {

      byte[] buffer = new byte[fileStream.length];

      fileStream.Read(buffer,0,buffer.Length);

      string str = System.Text.Encoding.UTF8.GetString(buffer);

      this.textBox1.Text = str;

     

    }

     

    线程与进程的概念

    (1) 进程概念:是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。

    Process.Start(“notepad.exe”,”a.txt”);

    (2) 线程概念。 是Windows 任务调度的最小单位。线程是程序中的一个执行流。

    解决问题:进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程序的进一步提高。

    所有代码都必须执行在线程。有线程才能有代码执行。

    (3) 单线程问题:

     

    (4) 创建线程,以及线程的属性

    Priority

     

    Name

     

    Abort

     

    Thread.Join(1000):主线程会阻塞等待 thread实例指向的线程,如果在1000ms内,thread线程执行完成了的画,那么主线程就立即往下执行。如果超过那么也往下执行

     

    线程应用场景:

    (1)希望或等更多操作系统资源尽快处理我们的业务,缩短处理的时间。

    问题:一个线程执行需要10s ,分成两个线程:10s? 因为不断切换,实际上大于了10s,

    可是为什么说多线程提升了效率呢? 因为线程调度的问题,

    在一个操作系统中,同时可能有1000个线程在运行,如果一个进程有很多线程,

    因为CPU在不断的切换,那么这个程序被调度的概率就增大了。

    (2):如果一个如果一个非常复杂的操作。需要占用非常长的时间。而WinForm又不允许阻塞UI线程。

     

    后台线程

    myThread.IsBackground = true

    当程序或窗体关闭的时候应用程序也关闭,就是后台线程

    要是不关闭就叫前台线程,所以一般我们都用后台线程!

     

    线程执行带参数的方法

    List<int> list = new List<int >{1,2,3,4,5,6};

    ParameterizedThreadStart threadStart = new ParameterizedThreadStart(Show);

    Thread thread1 = new Thread(threadStart);

    thread1.IsBackground = true;

    thread1.Start(list);

     

    private void Show(object obj);

    {

    List<int>list = (list<int>)obj

    foreach(int i in list)

    {

     MessageBox.Show(i.ToString());

    }

    }

     

     

     

     

     

    5:跨线程访问

    Thread thread2 = new Thread();

    thread2.IsBackground = true;

    thread2.Start()

     

    上面这种方法不太专业,

    建议使用另一种方法Invoke:

     

    进程

     

    ThreadStart threadStart = new ThreadStart(StartCaul); //这是一个委托

    Thread myThread = new Thread(threadStart);

    myThread.Name = “shit”;

    myThread.Priority = ThreadPriority.Highest;//线程的优先级

    //myThread.Abort();这是一种很暴力的终止线程的方法

    myThread.Start();//将线程设为运行状态。

    myThread.join(1000); 阻塞1000ms

     

    /*

    thread.Join(1000)

    主线程会阻塞等待 thread实例指向的线程,如果在1000ms内,thread线程执行完成了的话,那么主线程就立即往下执行。如果超时那么也往下执行。

    */

     

     

    private void StartCaul()

    {

    … …

    }

     

    线程同步与线程池

    Thread thread3 = new Thread(GetResult);

    thread3.IsBackground = true;

    thread3.Start();

     

    private void GetResult()

    {

    int a = 0;

    for(int I = 0; i<9999999;i++)

    {

    a=I;

    }

    if(this.textBox1.InvokeRequired)//判断一下textbox是否在创建它的以外的线程访问

     

    {

    this.textBox1.Invoke(new Action<string,TextBox>(SetValue))

    }

    }

     

    private void SetValue(string txt,TextBox tb)

    {

     

    }

     

    线程同步

     

    用锁:

     

    线程池

     

    ·线程切换消耗资源,cpu在切换线程的时候,需要把当前线程执行的状态保持到寄存器里面去。

     

    ·线程创建非常消耗资源。线程创建非常慢,占用了大量的内存空间。每个线程最少1M内存开销。

    线程池:提高了线程的利用率,非常适合工作任务非常小,而且又需要使用单独的线程来解决的  问题。

    什么时候用线程池?什么时候用手动创建线程?

     

    1、        能用线程池就用线程池

    2、        我们想手动关闭现成的话那么必须手动创建了。Abort() Join()

    3、        我们需要对线程池的线程的优先级做设置的情境下,只能使用手动创建线程。

    4、        如果执行的线程执行时间特别长。建议手动创建线程

     

    Socket相关概念

    socket是一种进程通信机制

     

    端口的分类

    (1)   公认端口:01023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。

    (2)   注册端口:102449151.它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其他目的。例如:许多xitong处理动态端口从1024左右开始。

    (3)   动态和/或私有端口:4915265535。理论上不应为服务分配这些端口。

  • 相关阅读:
    实验5 数独游戏界面设计
    实验4 颜色、字符串资源的使用 实验报告
    实验五 操作系统之存储管理
    实验四 主存空间的分配和回收
    实验三 进程调度模拟程序
    实验二作业调度模拟程序(先来先服务(FCFS)调度算法)
    实验八 SQLite数据库操作
    实验七 BindService模拟通信
    实验六 在应用程序中播放音频和视频
    实验五 数独游戏界面设计
  • 原文地址:https://www.cnblogs.com/eret9616/p/8747493.html
Copyright © 2020-2023  润新知