《VBNET中的网络编程》由会员分享,可在线阅读,更多相关《VBNET中的网络编程(46页珍藏版)》请在金锄头文库上搜索。
1、一一. . 网络编程基础知识网络编程基础知识二二. .Net. .Net中的网络编程类中的网络编程类三三. .Net. .Net网络程序基本结构网络程序基本结构四四. .Net. .Net多线程技术多线程技术 五五. . 在网络编程中结合多线程技术在网络编程中结合多线程技术本章目录本章目录 一网络编程基础知识一网络编程基础知识1.1SocketSocket通常也称为通常也称为“套接字套接字”,用于描述,用于描述IP地址地址和和端口端口。它实质上提供了进程通信的端点。进程通信之前,。它实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则没有办法建立联双方首先必须各自创建一
2、个端点,否则没有办法建立联系并相互通信。正如打电话之前,双方必须各自拥有一系并相互通信。正如打电话之前,双方必须各自拥有一台电话机。台电话机。Socket同样可以被视为一个同样可以被视为一个数据通道数据通道,这个通道,这个通道架设在应用程序端(架设在应用程序端(客户端客户端)和)和服务器端服务器端之间,而后,之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来数据的读取(接收)和写入(发送)均针对这个通道来进行。进行。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录socket是面向是面向客户客户/服务器模型服务器模型而设计的,针而设计的,针对客户和服务器程序提供不
3、同的对客户和服务器程序提供不同的socket功能调功能调用。用。客户端需要客户端需要申请申请一个一个socket(相当于一个想相当于一个想打电话的人首先获得一部电话机打电话的人首先获得一部电话机),系统为之分,系统为之分配一个配一个socket号;服务器端则拥有号;服务器端则拥有全局公认全局公认的的socket,任何客户端都可以向它发出连接请求,任何客户端都可以向它发出连接请求和信息请求和信息请求(相当于一个被呼叫的电话拥有一个相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码呼叫方知道的电话号码)。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录Socket是访问是访问I
4、nternet使用得最广泛的方使用得最广泛的方法。在法。在Internet上有很多用于提供网络服务的主上有很多用于提供网络服务的主机,这些主机一般运行了多个服务软件,提供不机,这些主机一般运行了多个服务软件,提供不同的服务(比如电子邮件服务、同的服务(比如电子邮件服务、ftp服务、服务、http网页服务等)。而网页服务等)。而每种服务实际上都会打开一个每种服务实际上都会打开一个Socket,并绑定到一个端口上,并绑定到一个端口上,不同的端口对不同的端口对应于不同的服务应于不同的服务。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录可见,可见,Socket正如其英文原意(正如
5、其英文原意(“插座插座”)那样,象一个多孔插座。而一台主机犹如布)那样,象一个多孔插座。而一台主机犹如布满各种插座的房间,每个插座有一个编号,有的满各种插座的房间,每个插座有一个编号,有的插座提供插座提供220伏交流电,伏交流电,有的提供有的提供110伏交流电,伏交流电,有的则提供有线电视节目。有的则提供有线电视节目。客户软件将插头插客户软件将插头插到不同编号的插座,就可以得到不同的服务。到不同编号的插座,就可以得到不同的服务。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录1.2网络协议网络协议网络协议是网络上计算机为交换数据所必须网络协议是网络上计算机为交换数据所必须遵
6、守的通信规范和消息格式的集合。目前常用的遵守的通信规范和消息格式的集合。目前常用的网络协议有网络协议有TCP协议和协议和UDP协议。协议。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录.TCP协议协议TCP是是TranferControlProtocol的简称,是一的简称,是一种种面向连接面向连接的保证可靠传输的协议。通过的保证可靠传输的协议。通过TCP协议协议传输,得到的是一个顺序的无差错的数据流。发送传输,得到的是一个顺序的无差错的数据流。发送方和接收方的方和接收方的两个两个Socket之间之间必须建立连接,以必须建立连接,以便在便在TCP协议的基础上进行通信。当一个
7、协议的基础上进行通信。当一个Socket(通常都是(通常都是ServerSocket)等待建立连接)等待建立连接时,另一个时,另一个Socket可以请求连接,一旦这两个可以请求连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输,连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。双方都可以进行发送或接收操作。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录.UDP协议协议UDP是是UserDatagramProtocol(数据报协议)(数据报协议)的简称,是一种的简称,是一种无连接无连接的协议。每个数据报都是一的协议。每个数据报都是一个独立的信
8、息,在其中包括了完整的源地址或目的个独立的信息,在其中包括了完整的源地址或目的地址信息,因此无需要建立发送方和接收方的连接。地址信息,因此无需要建立发送方和接收方的连接。每个数据报在网络上以任何可能的路径传往目的每个数据报在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。内容的正确性都是不能被保证的。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录 二二 .Net中的网络编程类中的网络编程类.NetFramework为应用程序访问为应用程序访问Internet提供了分提供了分
9、层的、可扩展的以及受管辖的网络服务。其名字空间层的、可扩展的以及受管辖的网络服务。其名字空间System.Net和和System.Net.Sockets包含丰富的类可以包含丰富的类可以开发多种网络应用程序。开发多种网络应用程序。.Net采用的分层结构允许应用采用的分层结构允许应用程序在不同的控制级别上访问网络,这些级别几乎囊括程序在不同的控制级别上访问网络,这些级别几乎囊括了了Internet的所有需要的所有需要从从Socket套接字到普通的请套接字到普通的请求求/响应响应。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录抛开抛开ISO/OSI模型的模型的7层构架,单从层构
10、架,单从TCP/IP模模型上的逻辑层面上看,型上的逻辑层面上看,.Net网络编程类可以视为网络编程类可以视为包含包含3个层次:个层次:请求请求/响应层响应层、应用协议层应用协议层、传输传输层层。WebReqeust和和WebResponse代表了请求代表了请求/响应层,支持响应层,支持Http、TCP和和UDP的类组成了应用的类组成了应用协议层,而协议层,而Socket类类处于最底层的传输层。处于最底层的传输层。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录System.Net.Sockets命名空间为需要访问网命名空间为需要访问网络底层功能的开发人员提供了络底层功能的开
11、发人员提供了Socket接口。接口。System.Net命名空间中的所有其他网络访问类命名空间中的所有其他网络访问类都是建立在都是建立在Socket的基础上的。如的基础上的。如TCPClient、TCPListener和和UDPClient类,以及提供用于网类,以及提供用于网络访问的基础数据流的络访问的基础数据流的NetworkStream类等。类等。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录2.1IPAddress类和类和IPEndPoint类类 在在System.Net命名空间中,有两个专门用于处理各种命名空间中,有两个专门用于处理各种类型的类型的IP地址信息地址
12、信息的类型:的类型:IPAddress类和类和IPEndPoint类。类。1.IPAddress类类IPAddress类用于表示一个类用于表示一个IP地址,可以使用地址,可以使用Parse方法直接方法直接创建创建IPAddress的实例的实例:IPAddressip=IPAddress.Parse(192.168.1.1);IPAddress类还提供了类还提供了4个只读属性,分别代表程序中使用的特殊个只读属性,分别代表程序中使用的特殊IP地址:(地址:(1)Any:代表本地系统可用的任何:代表本地系统可用的任何IP地址。地址。(2)Broadcast:代表本地网络的:代表本地网络的IP广播地址
13、。广播地址。(3)Loopback:代表系统的回送地址。:代表系统的回送地址。(4)None:代表系统上没有网络接口。:代表系统上没有网络接口。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录另外,在另外,在System.Net命名空间下,包含有一个命名空间下,包含有一个Dns类,可以利用该类的类,可以利用该类的GetHostName()方法找到本方法找到本地系统的主机名,然后再用地系统的主机名,然后再用GetHostByName()找到主找到主机的机的IP地址。地址。2.IPEndPoint类类IPEndPoint对象通过一个对象通过一个IP地址地址/端口端口的组合来确定
14、一的组合来确定一个连接端点。其构造函数为:个连接端点。其构造函数为:IPEndPoint(IpAddressaddress,intport);该类有几个常用的属性:该类有几个常用的属性:(1)Address:得到或者设置:得到或者设置IP地址。地址。(2)AddressFamily:获取网际协议获取网际协议(IP)地址族。地址族。(3)Port:获取或设置终结点的获取或设置终结点的TCP端口号端口号. 本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录例:例:DimlocalEndPointAsNewIPEndPoint(IPAddress.Parse(127.0.0.1),
15、1024)指定指定IP和和Port本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录2.2Socket类类Socket类的构造函数为:类的构造函数为:publicSocket(AddressFamilyaddressFamily,SocketTypesocketType,ProtocolTypeprotocolType);addressFamily参数指定参数指定Socket使用的寻址方使用的寻址方案,对于网络上的案,对于网络上的IP通信来说,通信来说,addressFamily总总是使用是使用AddressFamily.InterNetwork这个值。这个值。socketT
16、ype参数指定参数指定Socket的类型。的类型。protocolType参数指定参数指定Socket使用的协议。使用的协议。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录本章目录本章目录例:例:ImportsSystem.Net.socketsImportsSDimSserverAsSocket=NothingSserver=NewSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)使用使用TCP协议协议VB.NET程序设计教程程序设计教程本书目录本书目录Socket类中常用的成员函数
17、类中常用的成员函数(1)绑定地址绑定地址(服务器端服务器端创建创建Socket后首先要做后首先要做的工作)的工作)voidBind(IPEndPointlocalEP);使使Socket与与一个本地端点相关联。一个本地端点相关联。只有服务器端的只有服务器端的Socket需要进行绑定。而且只有在需要进行绑定。而且只有在进行绑定后才能在服务器端调用进行绑定后才能在服务器端调用Socket的其它功能。的其它功能。例:例:DimlocalEndPointAsNewIPEndPoint(IPAddress.Parse(“127.0.0.1”),1024)指定指定IP地址和端口地址和端口Sserver.B
18、ind(localEndPoint)把把socket和该端点绑定和该端点绑定本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录(2)监听连接请求监听连接请求(只在(只在服务器端服务器端需要这一步骤)需要这一步骤) voidListen(intbacklog);backlog指定最多可指定最多可以接受的传入连接数。以接受的传入连接数。设置套接字处于监听状态。当数据到达某个端口时,设置套接字处于监听状态。当数据到达某个端口时,它会向主机发送通知消息。它会向主机发送通知消息。例:例:Sserver.Listen(100)开始监听,最多接受开始监听,最多接受100个连个连接。接。本章
19、目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录(3)接受连接请求接受连接请求(只在(只在服务器端服务器端需要这一步骤)需要这一步骤) SocketAccept();注意返回值是一个新建立的注意返回值是一个新建立的Socket。当服务器端正在监听的当服务器端正在监听的Socket调用调用Accept成员函成员函数,并且接收到了某个客户端发来的连接请求时,就数,并且接收到了某个客户端发来的连接请求时,就会会新建立一个新建立一个Socket,专门用来和这个客户端进行专门用来和这个客户端进行通信通信。例:例:DimnewsocketAsSocket=Sserver.Accept()注
20、意:服务器端和客户端真正进行收发数据都是通过注意:服务器端和客户端真正进行收发数据都是通过在建立连接时新建的在建立连接时新建的socket进行的。在上面的例子里进行的。在上面的例子里就是通过就是通过newsocket,而不是通过,而不是通过Sserver。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录(4)建立连接建立连接(只在(只在客户端客户端需要这一步骤)需要这一步骤)voidConnect(IPEndPointip);用来与远程服务器建立连接。连接之后,可以用用来与远程服务器建立连接。连接之后,可以用Send()发送数据或用发送数据或用Receive()函数接收数据
21、。函数接收数据。例:例:DimSclient=NewSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)DimlocalEndPointAsNewIPEndPoint(IPAddress.Parse(“127.0.0.1”),1024)指定要连接的指定要连接的服务器端的服务器端的端端点点Sclient.Connect(localEndPoint)本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录(5)发送数据发送数据 可以使用可以使用Socket类的类的Send()或或SendTo()成员函
22、数。成员函数。intSend(bytebuffer);intSendTo(bytebuffer,IPEndPointremoteIP);向指定的地址发送数据。向指定的地址发送数据。例:例:SClient.Send(Encoding.Unicode.GetBytes(TextBox1.Text)例子中的例子中的Encoding类是在类是在System.Text名字空间中定义的名字空间中定义的(所以需要在程序中(所以需要在程序中ImportSystem.Text)。另外采用)。另外采用Unicode编码才能正确传送汉字。编码才能正确传送汉字。本章目录本章目录VB.NET程序设计教程程序设计教程本书
23、目录本书目录(6)接收数据接收数据使用使用Socket类的类的Receive()或或ReceiveFrom()成员函成员函数来接收数据。数来接收数据。intReceive(bytebuffer);intReceiveFrom(bytebuffer,refIPEndPointip)例:例:Dimbytes(1024)AsByte用来存储接收到的字用来存储接收到的字节节newsocket.Receive(bytes)newsocket是服是服务器端接受一个连接请求后新建的一个务器端接受一个连接请求后新建的一个socket本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录(7)关闭
24、关闭Socket使用使用Socket类的类的Close()成员函数来关闭不再使用的成员函数来关闭不再使用的socket。例:例:asocket.Close()asocket是之前创建的一个是之前创建的一个socket本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录 三三.Net网络程序基本结构网络程序基本结构基于基于IP的通信有两种通信类型:的通信有两种通信类型:面向连接的面向连接的和和无连接无连接的的。在面向连接的通信中,。在面向连接的通信中,Socket使用使用TCP协议协议来建来建立两个立两个IP地址端点之间的会话。一旦建立了这种连接,地址端点之间的会话。一旦建立了这
25、种连接,就可以在设备之间可靠地传输数据。就可以在设备之间可靠地传输数据。为了建立面向连接的为了建立面向连接的Socket通信,通信,服务器和客户端服务器和客户端必须分别进行编程必须分别进行编程(也就是分别为服务器端和客户端编(也就是分别为服务器端和客户端编写一个独立的程序)。写一个独立的程序)。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录面向连接的网络程序基本结构及流程面向连接的网络程序基本结构及流程服务器端服务器端客户端客户端本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录3.1服务器端程序的基本流程服务器端程序的基本流程(1)建立)建立Socke
26、t。(2)将)将Socket绑定到用于绑定到用于TCP通信的本地通信的本地IP地址和端地址和端口上。口上。(3)设置)设置Socket处于监听状态。处于监听状态。(4)等待客户端连接请求)等待客户端连接请求,当收到连接请求时则与客户当收到连接请求时则与客户端建立连接。端建立连接。(5)与客户端发送数据或接受数据。)与客户端发送数据或接受数据。(6)关闭)关闭Socket。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录3.2客户端程序的基本流程客户端程序的基本流程(1)建立)建立Socket。(2)与服务器进行连接。)与服务器进行连接。(3)发送或接受数据。)发送或接受数据
27、。(4)关闭)关闭Socket。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录3.3使用使用TcpListener和和TcpClient类类 在在System.Net.Sockets.命名空间下,有两个专门命名空间下,有两个专门用于用于TCP协议编程协议编程的类:的类:TCPClient和和TCPListener类。类。这两个类提供了直观的容易使用的属性和方法,从而这两个类提供了直观的容易使用的属性和方法,从而降低了降低了TCP协议编程的难度。协议编程的难度。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录.TcpListener(服务器端使用)(服务
28、器端使用)TcpListener类提供一些简单方法,用于在阻塞同步类提供一些简单方法,用于在阻塞同步模式下侦听和接受传入连接请求。客户端使用模式下侦听和接受传入连接请求。客户端使用TcpClient或或Socket来连接来连接TcpListener。可以使用可以使用IPEndPoint、本地、本地IP地址及端口号或者仅地址及端口号或者仅使用端口号,来创建使用端口号,来创建TcpListener。可以将本地。可以将本地IP地址地址指定为指定为Any,将本地端口号指定为,将本地端口号指定为0(如果希望基础服务(如果希望基础服务提供程序自动分配这些值)。提供程序自动分配这些值)。本章目录本章目录VB
29、.NET程序设计教程程序设计教程本书目录本书目录Start()方法用来开始侦听传入的连接请求。方法用来开始侦听传入的连接请求。Start()将对传入连接进行排队,直到调用将对传入连接进行排队,直到调用Stop()方法或它方法或它已经完成已经完成MaxConnections排队为止。可使用排队为止。可使用AcceptSocket()或或AcceptTcpClient()从传入连接请从传入连接请求队列提取连接。这两种方法将阻塞。如果要避免阻求队列提取连接。这两种方法将阻塞。如果要避免阻塞,可首先使用塞,可首先使用Pending()方法来确定队列中是否有方法来确定队列中是否有可用的连接请求。调用可用
30、的连接请求。调用Stop()方法来关闭方法来关闭TcpListener。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录.TcpClient(客户端使用)(客户端使用)TcpClient类是一个类是一个TCP客户端,它提供了一些简单客户端,它提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。它可以和接收流数据。它可以和TCPListener或者使用或者使用TCP创建的创建的服务器端服务器端Socket进行连接。进行连接。可以使用下面两种方法之一连接到服务器端:可以使用下面两种方法之一连接到服务器端:
31、(1)创建一个)创建一个TcpClient,并调用三个可用的,并调用三个可用的Connect方法之一方法之一:publicvoidConnect(IPEndPoint):使用指定的远程:使用指定的远程网络终结点将客户端连接到远程网络终结点将客户端连接到远程TCP主机。主机。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录publicvoidConnect(IPAddress,int):使用指定的:使用指定的IP地址和端口号将客户端连接到地址和端口号将客户端连接到TCP主机。主机。publicvoidConnect(string,int):将客户端连接到指:将客户端连接到指定
32、主机上的指定端口。定主机上的指定端口。(2)使用)使用远程主机的主机名和端口号远程主机的主机名和端口号创建创建TcpClient。此构造函数将自动尝试一个连接。此构造函数将自动尝试一个连接。要发送和接收数据,可以使用要发送和接收数据,可以使用GetStream()方法来方法来获取一个获取一个NetworkStream。调用。调用NetworkStream的的Write()和和Read()方法与远程主机之间发送和接收数据。使方法与远程主机之间发送和接收数据。使用用Close()方法释放与方法释放与TcpClient关联的所有资源。关联的所有资源。本章目录本章目录VB.NET程序设计教程程序设计教
33、程本书目录本书目录3.4NetworkStream(网络流)类(网络流)类 NetworkStream类提供用于网络访问的基础数据类提供用于网络访问的基础数据流。它提供了在阻塞模式下通过流。它提供了在阻塞模式下通过Stream套接字发送和套接字发送和接收数据的方法。要创建接收数据的方法。要创建NetworkStream,必须提供,必须提供连接的连接的Socket。也可以指定。也可以指定NetworkStream对所提对所提供的供的Socket具有哪些具有哪些FileAccess权限。权限。该类的该类的Write()和和Read()方法用于简单的单线程同方法用于简单的单线程同步阻塞步阻塞I/O。
34、若要使用不同的线程来处理。若要使用不同的线程来处理I/O,则可以,则可以使用使用BeginWrite()/EndWrite()和和BeginRead()/EndRead()方法进行通信。方法进行通信。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录.NetworkStream的构造函数的构造函数(1)publicNetworkStream(Socket):为指定的:为指定的Socket创建创建NetworkStream类的新实例。类的新实例。(2)publicNetworkStream(Socket,bool):用指定的:用指定的Socket所属权为指定的所属权为指定的So
35、cket初始化初始化NetworkStream类的新实例。类的新实例。(3)publicNetworkStream(Socket,FileAccess):用指:用指定的访问权限为指定的定的访问权限为指定的Socket创建创建NetworkStream类类的新实例。的新实例。(4)publicNetworkStream(Socket,FileAccess,bool):用指定的访问权限和指定的:用指定的访问权限和指定的Socket所属权为指定的所属权为指定的Socket创建创建NetworkStream类的新实例。类的新实例。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录 四
36、四.Net多线程技术多线程技术进程进程:应用程序的运行实例,是应用程序的一次动态执行。:应用程序的运行实例,是应用程序的一次动态执行。线程线程:进程内部的一个执行单元。从根本上说,线程是可由操作:进程内部的一个执行单元。从根本上说,线程是可由操作系统调度的一个最简单的代码单元,负责执行包含在进程的地址系统调度的一个最简单的代码单元,负责执行包含在进程的地址空间中的程序代码。空间中的程序代码。应用程序域应用程序域:在:在.NET框架中,提出了应用程序域的概念。所有框架中,提出了应用程序域的概念。所有程序编译后生成的都是中间代码,而这些中间代码的隔离、加载程序编译后生成的都是中间代码,而这些中间代
37、码的隔离、加载和卸载以及和卸载以及安安全边界的提供都是通过应用程序域来实现。一个进全边界的提供都是通过应用程序域来实现。一个进程可以包含一个或多个应用程序域,而一个应用程序域又可以包程可以包含一个或多个应用程序域,而一个应用程序域又可以包含一个或多个线程。无论在同一个进程之内还是在不同的进程之含一个或多个线程。无论在同一个进程之内还是在不同的进程之间,每个应用程序域之间都是相互无关的,这些不同的应用程序间,每个应用程序域之间都是相互无关的,这些不同的应用程序域之间只能通过远程通讯来实现消息和对象的传递域之间只能通过远程通讯来实现消息和对象的传递本章目录本章目录VB.NET程序设计教程程序设计教
38、程本书目录本书目录本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录多线程的意义多线程的意义:充分利用了充分利用了CPU的空闲时间片,可以用尽可能少的的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。率得到较大提高,同时增强了应用程序的灵活性。由于同一进程的所有线程是共享同一内存,所以由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操
39、作与运行、共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。数据的交互、资源的分配等问题更加易于解决。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录VB.Net对多线程的支持对多线程的支持由于由于VisualBasic.NET是基于是基于.NET框架的,而框架的,而.NET框框架的重要组成部分架的重要组成部分CLR(CommonLanguageRuntime,通用语言运行时)通用语言运行时)内置支持多线程应用内置支持多线程应用,可以通过系统的,可以通过系统的System.Threading.Thread类直接建立多线程应用程序,类直
40、接建立多线程应用程序,并且支持线程池等高级功能。因此任何并且支持线程池等高级功能。因此任何.NET框架结构下的框架结构下的语言,包括语言,包括VisualBasic.NET在编写多线程应用程序的时在编写多线程应用程序的时候,都可以直接利用系统类所提供的对象和方法,而不再候,都可以直接利用系统类所提供的对象和方法,而不再需要使用需要使用Win32API,因此可以大大减轻开发的困难和错,因此可以大大减轻开发的困难和错误所发生的几率。误所发生的几率。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录Thread类(线程类)的使用类(线程类)的使用在在System.Threading
41、名字空间中定义了名字空间中定义了Thread类,类,用来创建和维护线程。它能够创建并控制线程,设置其优用来创建和维护线程。它能够创建并控制线程,设置其优先级并获取其状态。它拥有先级并获取其状态。它拥有Start,Stop,Resume,Abort,Suspend和和Join(waitfor)等方法操纵线程,还可以通过等方法操纵线程,还可以通过如如Sleep,IsAlive,IsBackground,Priority,ApartmentState和和ThreadState等方法查询和设置线程状等方法查询和设置线程状态。态。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录Thr
42、ead类的使用方法类的使用方法(1)创建线程创建线程可以通过创建可以通过创建Thread类的实例来创建一个新线程,类的实例来创建一个新线程,并结合并结合AddressOf()函数来指定让这个线程执行的任务(一函数来指定让这个线程执行的任务(一般是一个过程或者函数)。般是一个过程或者函数)。例例:ImportSystem.ThreadingPublicSubthreadtask()EndSubDimnewthreadAsThread=NewThread(AddressOftheadtask)这样就创建了一个专门运行这样就创建了一个专门运行threadtask()过程的线程。过程的线程。本章目录本
43、章目录VB.NET程序设计教程程序设计教程本书目录本书目录(2)让线程开始运行让线程开始运行在创建了一个线程后,线程并没有真正开始运行。需要在创建了一个线程后,线程并没有真正开始运行。需要调用调用Thread类的类的Start()成员函数来开始线程的运行。成员函数来开始线程的运行。例:例:newthread.Start()newthread这个线程现在才会开这个线程现在才会开始运行。始运行。(3)让线程休眠一段时间让线程休眠一段时间可以调用可以调用Thread类的类的Sleep()成员函数来让线程休眠一成员函数来让线程休眠一段时间。段时间。例例1:newthread.Sleep(2000)让让
44、newthread休眠休眠2秒秒例例2:Thread.CurrentThread.Sleep(500)让当前线让当前线程休眠程休眠500毫秒毫秒本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录(4)挂起和恢复线程挂起和恢复线程Thread类的类的Suspend()成员函数可以挂起一个线程(相成员函数可以挂起一个线程(相当于让它暂停运行)。而当于让它暂停运行)。而Resume()成员函数则可以使一个被成员函数则可以使一个被挂起的线程重新开始运行。挂起的线程重新开始运行。(5)停止一个线程的运行停止一个线程的运行Thread类的类的Abort()成员函数可以终止一个线程的运行。
45、成员函数可以终止一个线程的运行。在调用在调用Abort之前,需要先调用之前,需要先调用IsAlive()判断线程处于活动状判断线程处于活动状态。态。例:例:Ifnewthread.IsAliveThennewthread.Abort()EndIf本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录(6)获得线程当前的状态获得线程当前的状态线程从创建到终止,它一定处于某一个状态,可以通过线程从创建到终止,它一定处于某一个状态,可以通过Thread类的类的ThreadState属性获得这个状态。当一个线程刚被属性获得这个状态。当一个线程刚被创建时,它处在创建时,它处在Unstart
46、ed状态,然后状态,然后Thread类的类的Start()方方法将使线程状态变为法将使线程状态变为Running状态。挂起的线程处于状态。挂起的线程处于Suspended状态,直到我们调用状态,直到我们调用resume()方法使其重新执()方法使其重新执行,这时候线程将重新变为行,这时候线程将重新变为Running状态。一旦线程被销毁或状态。一旦线程被销毁或者终止,则线程处于者终止,则线程处于Stopped状态,处于这个状态的线程将不状态,处于这个状态的线程将不复存在。线程还有一个复存在。线程还有一个Background状态,它表明线程运行在状态,它表明线程运行在前台还是后台。前台还是后台。本
47、章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录 五五. 在网络编程中结合多线程技术在网络编程中结合多线程技术在网络通信中的服务器端,尤其是在基于像在网络通信中的服务器端,尤其是在基于像TCP传传输这种需要建立连接的情况下,由于往往需要持续地监输这种需要建立连接的情况下,由于往往需要持续地监听来自不同客户端的连接请求,然后和发来连接请求的听来自不同客户端的连接请求,然后和发来连接请求的客户端建立连接并收发数据。由于这一过程是始终不断客户端建立连接并收发数据。由于这一过程是始终不断地进行的,所以在服务器端的程序里,一般会把它放到地进行的,所以在服务器端的程序里,一般会把它放到一
48、个独立的线程中执行,从而不会对服务器端的主程序一个独立的线程中执行,从而不会对服务器端的主程序造成影响。造成影响。本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录例例:DimSserverAsSocket服务器端的服务器端的socketDimnewthreadAsThread专门用来监听、连接及与客户端收发专门用来监听、连接及与客户端收发数据的线程数据的线程对对Sserver进行必要的创建、绑定等工作进行必要的创建、绑定等工作PublicSubWaitData()Sserver.Listen(100)监听,最多接受监听,最多接受100个连接个连接While(True)因为是
49、不停地响应连接,所以用无限循环因为是不停地响应连接,所以用无限循环Dimbytes(1024)AsByte用来存储接收到的字节用来存储接收到的字节DimnewsocketAsSocket=Sserver.Accept()若若接收接收到到,则创建一个新的则创建一个新的Socket与与之连接之连接newsocket.Receive(bytes)接收数据,若用接收数据,若用newsocket.send(Byte(),则发则发送数据送数据处理接收到的数据处理接收到的数据EndWhileEndSub本章目录本章目录VB.NET程序设计教程程序设计教程本书目录本书目录然后在服务器端程序中需要开始进行网络监听的地然后在服务器端程序中需要开始进行网络监听的地方,加入下列代码:方,加入下列代码:newthread=NewThread(AddressOfWaitData)建建立新的线程,专门执行立新的线程,专门执行WaitData过程过程newthread.Start()启动线程启动线程本章目录本章目录