一、ASP.NET

B/S  做网站(动态)、管理系统(OA,进销存等)

C/S--窗体软件

为什么现在很少用C/S做进销存等软件

B/S部署方便   C/S要安装

动态:与服务器(IIS(软件))进行交互

我们用C#写网站浏览器是不认识C#的那么我们的C#语言就由IIS进行执行

二、委托

就是方法的指针

指针:指向方法再内存中的地址

安全:委托就是封装了一个方法的地址,就好像一个指针指向了这个方法在内存中的地址,

那么调用的时候就是找到了这个方法的内存的地址,那么你就是调用的这个方法,为什么说它是安全的呢,

指针可以指向任何方法,那么如果指向了系统的方法你写入数据这时候就出问题了,

那么委托呢就好像我就规定了你只能调用你给我传进来的这个函数,

委托链

三、文件流

四、多线程

Thread thread=new Thread(一个委托变量);

thread.start();

1)方法的重入问题(数据的同步)

当我们有多个线程都调用一个方法的时候,就会出现一个同步的问题 出现数据混乱,

就是第一个线程调用执行这个方法的时候因为CPU执行的非常快第一个线程还没有执行完这个方法第二

个线程又进来又执行这个方法,那么这时候数据就不同步了,解决方案就是给这个方法加个锁  lock。

加锁之后,第一个线程进来之后这个方法就被锁住了,只有当这个线程执行完这个方法的时候释放这个锁,

其它线程才能执行

private void button1_Click(object sender, EventArgs e)         {             //定义一个无参无返回值的委托,调用Thread委托参数无参的构造方法  ,
通过委托指定一个要调用的方法             ThreadStart del = new ThreadStart(ShowNum);             //不进行跨线程的检查,默认是true,             TextBox.CheckForIllegalCrossThreadCalls = false;             //创建一个新的进程,把委托变量传过去             Thread thread = new Thread(del);             //系统会把这个进程设置为可运行状态
; i < ; i++)                 {                     int a = Convert.ToInt32(textBox1.Text);                     a++;                     textBox1.Text = a.ToString();                 }             }         }

     

2)后台线程

我们的UI线程就是前台线程,我们自己创建的线程默认都是前台线程,

那么一个进程只有全部的前台线程结束以后才会结束,比如说我们创建一个窗体程序,

在里面创建一个新的线程

我们的窗体线程默认有个UI线程,当这个新的线程在执行的时候,

如果关闭窗体(就是结束UI线程),那么这个程序是不会被结束的,

因为这个新的线程在创建的时候默认是前台线程,只有所有的前台线程都结束之后程序才会关闭,

那么此时就会出现一个情况,就是当用户点击窗体关闭按钮之后只是把这个窗体关闭了程序还是没有结束,

它会等这个新的线程执行完毕之后才会关闭

            //定义一个委托,通过委托指定调用一个方法

            ThreadStart start = new ThreadStart(SocktListen);

            //创建一个新线程

            Thread thread = new Thread(start);

            //设置为后台线程

            thread.IsBackground = true;

            TextBox.CheckForIllegalCrossThreadCalls = false;

            thread.Start();

--》解决方案

把我们创建的线程设置成后台线程

Thread thread=new Thread(一个委托变量);

thread.IsBackground=true;

thread.start();

建议我们创建的线程都设为后台线程,当所有的前台进程都结束之后后台线程会自动结束,

就不会出现上面的情况了

3)线程调用带参数的方法

Thread的构造函数其中的两个带委托变量的重载,一个委托的签名是无返回值无参数的,

一个是无返回值带一个object类型的参数, 

那么我们要传递多个值就可以通过一个Start()方法集合传过去,  thread.Start(list);

传递多个值 :  通过集合 

private void button2_Click(object sender, EventArgs e) 

        { 

            //准备参数 

            List<string> list = new List<string>() { "哈哈","呵呵","嘿嘿"}; 

            //定义一个Thread带ParameterizedThreadStart委托变量的构造函数  

这个委托是带一个object类型参数的委托 

            ParameterizedThreadStart par=new ParameterizedThreadStart (Func); 

            Thread thread = new Thread(par); 

            //通过Strat()方法把参数传过去 

            thread.Start(list); 

        } 

        void Func(object obj) 

        { 

            List<string> list=obj as List<string>; 

            foreach (string  item in list) 

            { 

                MessageBox.Show(item); 

            } 

        }

4)socket

1)浏览器和服务器软件就是通过Socket通信的。(就首相两个人通过电话联系)

2)浏览器和服务器软件通过http协议的语法来规范发送的数据格式

(这个http协议就好像两个人在电话中用中文通话,不能一个人用中文一个人用英语 ,

这样两个人就进行不了交流了)

http1.1版本前,都是使用的端连接,也就是当浏览器发送一个请求,服务器负责监听的Socket

(监听套接字)会产生一个新的Socket(通信套接字)与之进行数据交流,

然后这个通信套接字会到硬盘里把浏览器(客户端)请求的数据发送给浏览器(这就是响应),

然会会立即断开,如果浏览器要再次请求,就需要再建立连接。

http1.1版本开始使用长连接,服务器接收一次请求发出响应报文后会保持这个连接一段时间,

在这段时间内当浏览器需要重新请求数据时会使用这个当前的连接,

如果超过这daunting时间这个连接就会断开。

这样的好处

  --》服务器不会一直和浏览器保持连接,从而使得效率很低。

  --》当服务器需要再次请求数据的时候就可以通过当前的连接,超过一段时间之后就会自动断开 

private void btnListen_Click(object sender, EventArgs e) 

        { 

            //定义一个委托,通过委托指定调用一个方法 

            ThreadStart start = new ThreadStart(SocktListen); 

            //创建一个新线程 

            Thread thread = new Thread(start); 

            //设置为后台线程 

            thread.IsBackground = true; 

            TextBox.CheckForIllegalCrossThreadCalls = false; 

            thread.Start(); 

            //SocktListen(); 

        } 

        void SocktListen() 

        { 

            //首先服务端需要创建一个Socket监听对象,监听客户端的请求 

            //第一个参数:IP的版本 

            //第二个参数:以流的形式进行交互进行数据传输 

            //第三个参数:采用的协议:TCP 

            Socket socketlisten =  

new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

            //获取IP地址 

            IPAddress ip = IPAddress.Parse(txtIP.Text); 

            //通信节点,包括ip地址和端口号 

            IPEndPoint ippoint = new IPEndPoint(ip, Convert.ToInt32(txtDunkou.Text )); 

            //将通信节点(ip地址、端口号)绑定到负责监听的Socket上 

            socketlisten.Bind(ippoint); 

            //设置监听队列,把这个socket设置为侦听状态,可以设置最大监听数, 

这个最大监听数是根据服务器的机器性能来设置, 

            //如果这个数设置为10,那么一次处理客户端的10个请求,多的就要排队, 

等前面的10个请求处理完之后依次处理后面的 

            socketlisten.Listen(10); 

                Socket clientsocket = socketlisten.Accept(); 

                ShowText("客户端连接成功"); 

            //给每一个客户端请求单独new一个Socket进行数据的交流 

        } 

        void ShowText(string str) 

        { 

            txtContent.Text = str; 

        }

数往知来 ASP.NET_多线程_Socket<十五>的更多相关文章

  1. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. “全栈2019”Java多线程第十五章:当后台线程遇到finally

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Java线程和多线程(十五)——线程的活性

    当开发者在应用中使用了并发来提升性能的同时,开发者也需要注意线程之间有可能会相互阻塞.当整个应用执行的速度比预期要慢的时候,也就是应用没有按照预期的执行时间执行完毕.在本章中,我们来需要仔细分析可能会 ...

  4. Java多线程(十五):CountDownLatch,Semaphore,Exchanger,CyclicBarrier,Callable和Future

    CountDownLatch CountDownLatch用来使一个线程或多个线程等待到其他线程完成.CountDownLatch有个初始值count,await方法会阻塞线程,直到通过countDo ...

  5. JAVA多线程学习十五 - 阻塞队列应用

    一.类相关属性 接口BlockingQueue<E>定义: public interface BlockingQueue<E> extends Queue<E> { ...

  6. 教你50招提升ASP.NET性能(十五):解决性能问题时不要低估UI的价值

    (26)Don’t underestimate the value of the UI when tackling performance problems 招数26: 解决性能问题时不要低估UI的价 ...

  7. [Python 多线程] Concurrent (十五)

    concurrent包只有一个模块: concurrent.futures - 启动并行任务 异步并行任务编程模块,提供一个高级的异步可执行的便利接口. futures模块提供了2个池执行器 Thre ...

  8. “全栈2019”Java多线程第二十四章:等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java多线程第十四章:线程与堆栈详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. Java 数据结构之Stack

    Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构.Stack继承Vector,并对其进行了扩展. 用法: 1.只有一个构造函数: public Stack() {} 2.创建 ...

  2. GitHub的使用 —— 如何删除Repository

    如果要在GitHub上删除一个已经存在的Repository,该怎么办呢 ? 1.首先,点击这个资源(Repository),进入.会看到如下页面: 2.点击 Admin .在 Admin 页面的最下 ...

  3. Hibernate 异常 —— No CurrentSessionContext configured

    在使用 SessionFactory 的 getCurrentSession 方法时遇到如下异常 “No CurrentSessionContext configured ” 原因是: 在hibern ...

  4. shell脚本实现 视频格式转换 ffmpeg 实现视频转换

    #!/bin/bash original=$1 echo $original # check whether file is exist # if $original de chang du wei ...

  5. Android gingerbread eMMC booting

    Android gingerbread eMMC booting This page is currently under construction. The content of this page ...

  6. java double保留小数点的零的问题,java保留小数点问题

    1.用DecimalFormat格式化,DecimalFormat df=new DecimalFormat("0.00"); System.out.println(df.form ...

  7. radio checked不起作用的原因

    <table id="approveTable"> <tr> <td> <input type="radio" nam ...

  8. CSS3之边框样式(动画过渡)

    简述 CSS3中transition属性定义了过渡,我们可以使用它来辅助我们实现一个边框样式的动画过渡. 简述 transition 定义和用法 语法 实现 效果 源码 transition 定义和用 ...

  9. HTTP使用BASIC认证的原理及实现方法

    一.   BASIC认证概述 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户 ...

  10. POJ 3259 Wormholes【Bellman_ford判断负环】

    题意:给出n个点,m条正权的边,w条负权的边,问是否存在负环 因为Bellman_ford最多松弛n-1次, 因为从起点1终点n最多经过n-2个点,即最多松弛n-1次,如果第n次松弛还能成功的话,则说 ...