数往知来 ASP.NET_多线程_Socket<十五>

一、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);             //系统会把这个进程设置为可运行状态
            thread.Start();             ThreadStart del1 = new ThreadStart(ShowNum);             Thread thread1 = new Thread(del1);             thread1.Start();         }         void ShowNum()         {//lock锁             lock (this)             {                 for (int i = 0; i < 2000; 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; 

        }
时间: 2024-08-11 01:34:13

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

秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段.事件.互斥量.信号量进行了总结.有网友问到互斥量能处理“遗弃”问题,事件和信号量是否也能处理“遗弃”问题.因此本文将对事件和信号量作个试验,看看事件和信号量能否处理“遗弃”问题. 一.

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

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十五章:生产者与消费者线程详解 下一章 "全栈2019"Java多线程第二十六章:同步方法生产者与消费者线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"

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

当开发人员在应用中使用了并发来提升性能的同一时候.开发人员也须要注意线程之间有可能会相互堵塞. 当整个应用运行的速度比预期要慢的时候,也就是应用没有依照预期的运行时间运行完成.在本章中.我们来须要细致分析可能会影响应用多线程的活性问题. 死锁 死锁的概念在软件开发人员中已经广为熟知了,甚至普通的计算机用户也会常常使用这个概念.虽然不是在正确的状况下使用.严格来说,死锁意味着两个或者很多其它线程在等待还有一个线程释放其锁定的资源,而请求资源的线程本身也锁定了对方线程所请求的资源. 例如以下: Th

数往知来 JavaScript js正则表达式&lt;二十五&gt;

1.匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 评注:表单验证时很实用 2.匹配网址URL的正则表达式:[a-zA-z]+://[^s]* 评注:网上流传的版本功能很有限,上面这个基本可以满足需求 3.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用 4.匹配国内电话号码:d{3}-d{8}|d{4}-d{7} 评注:匹配形式如 051

多线程(十五、ConcurrentHashMap原理二类和方法分析)

ConcurrentHashMap的构造 ConcurrentHashMap,采用了一种"懒加载"的模式,只有到首次插入键值对的时候,才会真正的去初始化table数组. 构造方法: 1.空构造函数,默认桶大小162.指定桶初始容量的构造器,必须是2次幂值 /** * 指定table初始容量的构造器. * tableSizeFor会返回大于入参(initialCapacity + (initialCapacity >>> 1) + 1)的 最小2次幂值 */ publi

JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917 我们来继续学习多线程 Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock void lock():获取锁 v

“全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十五章:如何获取线程被等待的时间? 下一章 "全栈2019"Java多线程第三十六章:如何设置线程的等待截止时间 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&qu

JavaEE基础(二十五)/多线程、GUI

1.多线程(单例设计模式) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.private (2)在本类中定义一个本类的对象.Singleton s; (3)提供公共的访问方式. public static Singleton getInstance(){return s} 单例写法两种: (1)饿汉式 开发用这种方式. //饿汉式 class Singleton { //1,私有构造函数 private Singl

第十五章 链表

/** 数组与链表的区别:数组易随机访问,链表易插入和删除 链表组成:储存数据元素的数据域,储存下一结点地址的指针域 链表易于插入与删除 lists 的用法????????????????????? *///建立一个图书链表 #include<iostream> #include <string> using namespace std; struct book //第一步: 用于建立节点. class 默认为私有 struct 默认为公有 //节点组成:①数据域 ②指针域(*ne