一、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. PHP代码优化技巧大盘点

    PHP优化的目的是花最少的代价换来最快的运行速度与最容易维护的代码.本文给大家提供全面的优化技巧. 1.echo比print快. 2.使用echo的多重参数代替字符串连接. 3.在执行for循环之前确 ...

  2. Crypto API加密通信流程

    应用程序使用Crypto API进行加密通信的一般步骤如下: 1,include wincrypt.h 2,调用CryptAcquireContext()获得某个CSP模块中的密钥容器(key con ...

  3. Google 镜像站大集合

    没有了google的日子是相当难受,下面推荐一些google的镜像站,感谢原文博主的无私奉献,同时也欢迎大家总结科研上的小技巧,心得等来本平台投稿,好东西当然要拿出来共同分享! 以下镜像站分原版和非原 ...

  4. Quickhit快速击键

    一.项目分析 根据输入速率和正确率将玩家分为不同等级,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级.玩家最高级别 ...

  5. MVC 简单发送邮件示例

    没啥好说的 直接上代码 @{ try { WebMail.SmtpServer = "smtp.qq.com";//SMTP邮件服务器 WebMail.SmtpPort = ;// ...

  6. HDU 5033 (单调栈维护凸包) Building

    题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...

  7. 最小生成树之Kruskal

    模板题,学习一下最小生成树的Kruskal算法 对于一个连通网(连通带权图,假定每条边上的权均为大于零的实数)来说,每棵树的权(即树中所有边的权值总和)也可能不同 具有权最小的生成树称为最小生成树 生 ...

  8. Servlet 3.0 之@WebFilter怎么控制多个filter的执行顺序

    之前我们控制多个filter的执行顺序是通过web.xml中控制filter的位置来控制的,放在上面的会比放在下面的先执行,如下“用户登录检查过滤器”会比“接口日志过滤器”先执行   <!-- ...

  9. #define XXX do{...}while(0)

    <ol> <li>函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心.</li> <li>调用真正函数的 ...

  10. 常用应用层协议HTTP、RTSP、RTMP比较

    HTTP(超文本传输协议).RTSP(Real Time Streaming Protocol实时流传输协议).RTMP(Routing Table Maintenance Protocol路由选择表 ...