c#多线程和Socket笔记
进程和线程:
一个进程至少有一个线程,同一个进程中的多个线程可以并发执行。所谓的并发只是不停的切换,只是电脑切换的太快了,人我们的大脑感觉到是在并发执行。
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针,程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
多线程是指程序中包含多个执行流,即在一个程序中同时运行多个不同的线程来执行不同的任务(代码),也就是说单个程序创建多个并行执行的线程来完成各自的任务。
线程肯定也要执行一段代码的。所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。
线程启动时,通过委托调用该方法。
为什么要用多线程?
1.让计算机“同时”做多件事情,节约时间。
2.后台运行程序,提高程序的运行效率,也不会是主界面出现无响应的情况。
3.多线程可以让一个程序“同时”处理多件事情。
4.计算机CPU大部分时间处于空闲状态,浪费了CPU资源。
产生一个线程的4步骤:
1.编写产生线程所要执行的方法。
2.引用Syetem.Threading命名空间
3.实例化Thread类,并传入一个指向线程所要运行方法的委托。如:Thread thread=new Thread(一个委托:无参数无返回值的方法);
4.调用Thread实例的Start方法,标记该线程可以被CPU执行,但具体执行时间由CPU决定。如:Thread.Star();
前台线程:只有所有的前台线程都关闭才能完程序关闭时。默认为前台线程。
后台线程:只要所有的前台线程结束,后台线程自动结束。将一个线程设置为后台线程thread.IsBackground=true;
每个线程单独执行方法。
线程执行带参数的方法:
方法:void ShowTxtName(object name);
ParameterizedStart pts=new Parameterized(ShowTxtName);
Thread thread new Thread(pts);
thread.IsBackground=true;
thread.Start(txtName.Text);
也可以不创建Parameterized对象,直接:Thread thread=new Thread(ShowTxtName);
多线程执行带多个参数的方法时:由于线程接受的参数是object类型的,所以我们可以传数组,结构,或泛型,还有ArrayList等。
Socket相关概念:
(1)socket英文原意是“孔”或插座,作为进程通信机制,去后一种意思。通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。(其实就是两个程序通信用的)。
(2)socket非常类似于电话插座,以一个电话网为例,电话的通话双方相当于相互通信的两个程序,电话号码就是IP地址,任何用户在通话之前,首先要占用一部电话机,相当于申请一个socket,同时要知道对方的号码,相当于对方有一个固定的socket,然后向对方拨号呼叫,相当于发出连接请求,对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤销链接。
(3)在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务,每个服务打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务(应用程序)。
(4)例如:http使用80端口,ftp使用21端口,smpt使用23端口
(5)有两种类型:
a.流式socket(STREAM):是一种面向连接的socket,针对于面向连接的tcp服务应用,安全,但是效率低。
b.数据报式socket(DATAGRAM):是一种无连接的socket,对于无连接的UDP服务应用,不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高。
Socket一般应用模式:(服务器端和客户端)
1.服务器端的Socket(至少需要两个)
(1)一个负责接收客户端连接请求,但不负责与客户端通信
(2)每成功接受一个客户端的链接便在服务端产生一个对应的Socket
a.在接收客户端连接时创建
b.为每个连接成功的客户端创建一个对应的socket(负责和对应的客户端通信)
2.客户端Socket
(1)必须指定要连接的服务端地址和端口
(2)通过创建一个Socket对象来初始化一个服务器端的TCP链接
Socket的通讯过程:
1.服务器端:
(1)申请一个Socket
(2)绑定到一个IP地址和一个端口上
(3)开启侦听
2.客户端:
(1)申请一个Socket
(2)连接服务器(指明IP地址和端口号)
3.服务器接到连接请求后,产生一个新的Socket(端口大于1024)与客户端建立连接并进行通讯,原侦听Socket继续侦听。