第03章TP应用编程_第1页
第03章TP应用编程_第2页
第03章TP应用编程_第3页
第03章TP应用编程_第4页
第03章TP应用编程_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 1第第3 3章章 tcptcp应用编程应用编程 3.1 tcp3.1 tcp应用编程涉及的相关技术应用编程涉及的相关技术 3.2 3.2 利用同步利用同步tcptcp编写网络聊天程序编写网络聊天程序 3.3 3.3 利用同步利用同步tcptcp编写网络游戏编写网络游戏 3.4 3.4 异步异步tcptcp应用编程应用编程3.5 3.5 利用异步利用异步tcptcp编写网络聊天程序编写网络聊天程序2 23.1 tcp3.1 tcp应用编程应用编程涉及的相关技术涉及的相关技术 3.1.1 tcp3.1.1 tcp简介简介3.1.2 3.1.2 同步同步tcptcp应用编程的一般步骤应用编程的一

2、般步骤.3 3 tcpclient tcpclient类与类与tcplistenertcplistener类类.4 4 networkstream networkstream类类.5 5 解决解决tcptcp协议的无消息边界问题协议的无消息边界问题3 33 .1 tcp tcp简介简介tcptcp是是transmission control protocoltransmission control protocol(传输控制协议)的简称,是(传输控制协议)的简称,是tcp/iptcp/ip体系中面向连接的运输层协议,在网络中提供全双工的和

3、可靠体系中面向连接的运输层协议,在网络中提供全双工的和可靠的服务。的服务。tcptcp最主要的特点:最主要的特点: 1) 1) 是一种基于连接的协议是一种基于连接的协议( (类似于打电话类似于打电话) )。 2) 2) 保证数据准确到达。保证数据准确到达。 3) 3) 保证各数据到达的顺序与数据发出的顺序相同。保证各数据到达的顺序与数据发出的顺序相同。 4) 4) 传输的数据无消息边界。传输的数据无消息边界。服务器、客户端是相对的概念,任何一台机器既可以单独运行服务器服务器、客户端是相对的概念,任何一台机器既可以单独运行服务器端程序,也可以单独运行客户端程序。也可以将服务器代码和客户端端程序,

4、也可以单独运行客户端程序。也可以将服务器代码和客户端代码写到同一个程序中。代码写到同一个程序中。4 43.1.2 3.1.2 同步同步tcptcp应用编程的一般步骤应用编程的一般步骤在同步在同步tcptcp应用编程中,发送数据、接收数据以及监听客户端连接均应用编程中,发送数据、接收数据以及监听客户端连接均采用同步阻塞方式工作。采用同步阻塞方式工作。使用同步使用同步tcptcp编写编写服务器端服务器端应用程序的一般步骤为:应用程序的一般步骤为: 1.1. 创建一个包含采用的网络类型、数据传输类型和协议类型的创建一个包含采用的网络类型、数据传输类型和协议类型的tcplisttcplistenere

5、ner对象,在指定的端口进行监听。对象,在指定的端口进行监听。2.2. 接受客户端的连接请求,根据客户端发送的连接信息创建与该客户接受客户端的连接请求,根据客户端发送的连接信息创建与该客户端对应的端对应的tcpclienttcpclient对象。对象。3.3. 根据创建的根据创建的tcpclienttcpclient对象,利用对象,利用tcpclienttcpclient对象的对象的getstreamgetstream方法得方法得到到networkstreamnetworkstream对象,然后利用对象,然后利用networkstreamnetworkstream对象的对象的writewrit

6、e方法和方法和readread方法分别与每个连接的客户进行数据传输。方法分别与每个连接的客户进行数据传输。4.4. 与对方通信结束后,关闭与对方的连接,释放与与对方通信结束后,关闭与对方的连接,释放与tcpclienttcpclient关联的所关联的所有资源。有资源。5 53.1.2 3.1.2 同步同步tcptcp应用编程的一般步骤(续)应用编程的一般步骤(续) 使用同步使用同步tcptcp编写编写客户端客户端程序的一般步骤为:程序的一般步骤为:1.1. 创建一个包含传输过程中采用的网络类型、数据传输类型创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的和协议类型的tcpclie

7、nttcpclient对象。对象。2.2. 调用调用tcpclienttcpclient对象的对象的connectconnect方法与远程服务器建立连接。方法与远程服务器建立连接。3.3. 利用利用tcpclienttcpclient对象的对象的getstreamgetstream方法得到方法得到networkstreamnetworkstream对象,然后利用对象,然后利用networkstreamnetworkstream对象的对象的writewrite方法和方法和readread方法与服务器进行数据传输。方法与服务器进行数据传输。4.4. 完成工作后,向服务器发送关闭信息,并关闭与服务器

8、的完成工作后,向服务器发送关闭信息,并关闭与服务器的连接,释放相应资源。连接,释放相应资源。6 63 3.1.3 tcpclient.1.3 tcpclient与与tcplistenertcplistener 两个类均封装了底层的套接字,并分别提供了对套接字进两个类均封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了一步封装后的同步和异步操作的方法,降低了tcptcp应用编应用编程的难度。程的难度。1.1. tcpclienttcpclient类用于提供本地主机和远程主机的连接、发送类用于提供本地主机和远程主机的连接、发送和接收流数据。和接收流数据。2.2. t

9、cplistenertcplistener类用于侦听和接受传入的连接请求。类用于侦听和接受传入的连接请求。7 73 3.1.3 tcpclient.1.3 tcpclient与与tcplistenertcplistener(续)(续)tcpclienttcpclient类类1.1. tcpclienttcpclient类在类在system.net.socketsystem.net.socket命名空间下。命名空间下。2.2. 编写客户端程序时,需要直接编写客户端程序时,需要直接利用构造函数利用构造函数创建创建tcpclienttcpclient对象。对象。3.3. 构造函数有四种重载形式(见课

10、本)构造函数有四种重载形式(见课本)编写客户端程序时,常用形式为:编写客户端程序时,常用形式为:tcpclient tcpclient=new tcpclient(“”, 51888) tcpclient tcpclient=new tcpclient(“”, 51888) 它相当于:它相当于:tcpclient tcpclient=new tcpclient();tcpclient tcpclient=new tcpclient();tcpclient.connect(, 51888);tcpclient.connect(, 51888);编写服务器端程序时,不需要直接使用其构造函数创建编写

11、服务器端程序时,不需要直接使用其构造函数创建tcpclienttcpclient对象,对象,而是利用而是利用tcplistenertcplistener对象的对象的accepttcpclientaccepttcpclient方法得到与该远程主机对方法得到与该远程主机对应的应的tcpclienttcpclient对象。对象。8 83.1.3 tcpclient3.1.3 tcpclient与与tcplistenertcplistener(续)(续) tcpclienttcpclient类的常用属性类的常用属性属性含义client获取或设置基础套接字lingerstate获取或设置close调用后

12、仍保持打开的时间nodelay获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟(true禁用延迟,默认false) receivebuffersize获取或设置接收缓冲区的大小(默认8192字节)receivetimeout获取或设置套接字接收数据的超时时间(毫秒)sendbuffersize获取或设置发送缓冲区的大小(默认8192字节)sendtimeout获取或设置套接字发送数据的超时时间(毫秒)9 93.1.3 tcpclient3.1.3 tcpclient与与tcplistenertcplistener(续)(续) 在同步工作方式下,在同步工作方式下,tcpclienttcpc

13、lient类的常用方法类的常用方法方法含义close关闭tcpclient实例,而不关闭基础连接connect用指定的主机名和端口号将客户端连接到tcp主机getstream获取发送和接收数据的networkstream对象10103.1.3 tcpclient3.1.3 tcpclient与与tcplistenertcplistener(续)(续) tcpclienttcpclient用法举例:用法举例:tcpclient tcpclient = new tcpclient();tcpclient tcpclient = new tcpclient();tcpclient.connect(c

14、ontososerver, 11000);tcpclient.connect(contososerver, 11000);networkstream networkstream = tcpclient.getstream();networkstream networkstream = tcpclient.getstream();networkstream.readtimeout = 10;networkstream.readtimeout = 10;byte bytes = new byte1024;byte bytes = new byte1024;networkstream.read(by

15、tes, 0, 1024);networkstream.read(bytes, 0, 1024);string data = encoding.utf8.getstring(bytes); string data = encoding.utf8.getstring(bytes); networkstream.close();networkstream.close();tcpclient.close(); tcpclient.close(); 11113 3.1.3 tcpclient.1.3 tcpclient与与tcplistenertcplistener类(续)类(续)tcplistene

16、rtcplistener类类1.1. tcplistenertcplistener类在类在system.net.socketsystem.net.socket命名空间下。用于监听和接受命名空间下。用于监听和接受传入的连接请求。传入的连接请求。2.2. 构造函数(见课本),常用构造函数:构造函数(见课本),常用构造函数:tcplistener(ipaddress localaddr, int port)tcplistener(ipaddress localaddr, int port)3.3. 举例:举例:ipaddress ipaddress = dns.resolve(localhost).

17、addresslist0;ipaddress ipaddress = dns.resolve(localhost).addresslist0;trytry tcplistener tcplistener = new tcplistener(ipaddress, 1326); tcplistener tcplistener = new tcplistener(ipaddress, 1326); catch ( exception e)catch ( exception e) console.writeline( e.tostring(); console.writeline( e.tostrin

18、g(); 12123 3.1.3 tcpclient.1.3 tcpclient与与tcplistenertcplistener类(续)类(续)在同步工作方式下,在同步工作方式下, tcplistenertcplistener类类常用常用的方法:的方法:1.1. accepttcpclientaccepttcpclient在同步阻塞方式下获取并返回一个可以用来接收和发送数据的封在同步阻塞方式下获取并返回一个可以用来接收和发送数据的封装了装了socketsocket的的tcpclienttcpclient对象对象 ;2.2. startstart启动监听,构造函数为:启动监听,构造函数为:pub

19、lic void start(int backlog)public void start(int backlog)参数参数backlogbacklog为请求队列的最大长度,即最多允许的在排队队列中为请求队列的最大长度,即最多允许的在排队队列中的客户端请求连接个数;的客户端请求连接个数;3.3. stopstop停止监听请求,构造函数为:停止监听请求,构造函数为:public void stop();public void stop();(补充)(补充)tcpserverchanneltcpserverchannel类:在分布式处理中,为远程调用实现使用类:在分布式处理中,为远程调用实现使用 t

20、cp tcp 协议传输消息的服务器信道。协议传输消息的服务器信道。13133.1.4 networkstream3.1.4 networkstream类类 networkstreamnetworkstream类提供用于网络访问的基础数据流,即提供在阻塞模式类提供用于网络访问的基础数据流,即提供在阻塞模式下通过套接字发送和接收数据的方法。下通过套接字发送和接收数据的方法。 基本用法(见课本)基本用法(见课本)networkstream networkstream = new networkstream(clientsocket );networkstream networkstream = ne

21、w networkstream(clientsocket );string message = string message = 发送的数据发送的数据;byte sendbytes = system.text.encoding.utf8.getbytes(message );byte sendbytes = system.text.encoding.utf8.getbytes(message );networkstream.write(sendbytes ,0, sendbytes.length );networkstream.write(sendbytes ,0, sendbytes.len

22、gth );byte readbytes = new byte1024;byte readbytes = new byte1024;int i = networkstream.read(readbytes, 0, readbytes.length);int i = networkstream.read(readbytes, 0, readbytes.length); 说明:对于同步说明:对于同步tcptcp应用编程,直接使用应用编程,直接使用networkstreamnetworkstream对象进行通信对象进行通信仍然比较复杂,所以一般利用该对象得到其他更简单的对象,然后利仍然比较复杂,所以

23、一般利用该对象得到其他更简单的对象,然后利用这些更简单的对象实现通信,比如用这些更简单的对象实现通信,比如binaryreaderbinaryreader对象、对象、binarywritebinarywriteerer对象、对象、streamreaderstreamreader对象、对象、streamwriterstreamwriter对象等。对象等。14143.1.4 networkstream3.1.4 networkstream类(续)类(续)writewrite方法:方法:1.1. networkstreamnetworkstream对象的对象的writewrite方法的返回值为方法的

24、返回值为voidvoid,该对象之所以不,该对象之所以不返回实际发送的字节数,是因为能保证字节数组中的数据全部发送返回实际发送的字节数,是因为能保证字节数组中的数据全部发送到到tcptcp发送缓冲区中。发送缓冲区中。 2.2. 在使用在使用networkstreamnetworkstream对象的对象的writewrite方法前最好先检测方法前最好先检测networkstreamnetworkstream对象的对象的writeablewriteable属性是否为属性是否为truetrue。 3.3. 如果发送的全部是单行文本信息,创建如果发送的全部是单行文本信息,创建networkstream

25、networkstream对象后,使用对象后,使用streamreaderstreamreader和和streamwriterstreamwriter的的readlinereadline和和writelinewriteline方法更简单。方法更简单。readread方法:方法:1.1. 调用调用networkstreamnetworkstream类的类的readread方法前应确保方法前应确保networkstreamnetworkstream对象的对象的cancanreadread属性值有效属性值有效2.2. 由于有可能由于有可能tcptcp接收缓冲区还没有接收到对方发送过来的指定长度的接收

26、缓冲区还没有接收到对方发送过来的指定长度的数据,所以数据,所以readread方法有一个整型的返回值。方法有一个整型的返回值。3.3. 如果远程主机关闭了套接字连接,并且此时有效数据已经被完全接如果远程主机关闭了套接字连接,并且此时有效数据已经被完全接收,那么收,那么readread方法的返回值将会是方法的返回值将会是0 0字节。字节。15153.1.5 3.1.5 解决解决tcptcp协议的无消息边界问题协议的无消息边界问题在网络传输中,可能会出现发送方一次发送的消息与接收方一在网络传输中,可能会出现发送方一次发送的消息与接收方一次接收的消息不一致的现象。这主要是因为次接收的消息不一致的现象

27、。这主要是因为tcptcp协议是字节流形协议是字节流形式的、无消息边界的协议,由于受网络传输中的不确定因素的式的、无消息边界的协议,由于受网络传输中的不确定因素的影响,因此不能保证单个影响,因此不能保证单个sendsend方法发送的数据被单个方法发送的数据被单个receivereceive方方法读取。法读取。实际应用中,解决实际应用中,解决tcptcp协议消息边界问题的方法有三种:协议消息边界问题的方法有三种:1.1. 发送固定长度的消息。该方法适用于消息长度固定的场合。发送固定长度的消息。该方法适用于消息长度固定的场合。2.2. 将消息长度与消息一起发送。将消息长度与消息一起发送。3.3.

28、使用特殊标记分隔消息。使用特殊标记分隔消息。16163.2 3.2 利用同步利用同步tcptcp编写网络聊天程序编写网络聊天程序利用同步利用同步tcptcp和和binaryreaderbinaryreader及及binarywriterbinarywriter对象编写一个简单的对象编写一个简单的网络聊天程序。功能要求:网络聊天程序。功能要求:1)1) 任何一个客户端,均可以与服务器进行通信。任何一个客户端,均可以与服务器进行通信。2)2) 服务器要能显示客户端连接的状态,当客户端连接成功后,要服务器要能显示客户端连接的状态,当客户端连接成功后,要自动及时告知客户端已经连接成功的信息。自动及时告

29、知客户端已经连接成功的信息。3)3) 客户端和服务器建立连接后,即可以和服务器聊天。客户端和服务器建立连接后,即可以和服务器聊天。(将实验改为:一个客户和其他任一个客户聊天,用(将实验改为:一个客户和其他任一个客户聊天,用streamrestreamreaderader和和streamwriterstreamwriter对象实现字符串的接收和发送)对象实现字符串的接收和发送)4)4) 不论客户端何时退出程序,服务器都要做出正确判断,并显示不论客户端何时退出程序,服务器都要做出正确判断,并显示该客户连接和断开连接的情况。该客户连接和断开连接的情况。 17173.2 3.2 利用同步利用同步tcp

30、tcp编写网络聊天程序(续)编写网络聊天程序(续) 服务器端设计界面(具体代码见实验教材服务器端设计界面(具体代码见实验教材( (实验实验8)8)的源程序)的源程序)服务器端设计界面buttonstarttextboxsendcomboboxreceiverbuttonstopbuttonsend18183.2 3.2 利用同步利用同步tcptcp编写网络聊天程序(续)编写网络聊天程序(续) 客户端设计界面(具体代码见客户端设计界面(具体代码见实验教材实验教材( (实验实验8)8)的源程序)的源程序)聊天客户端设计界面textboxsendbuttonconnectbuttonsend1919

31、3.2 3.2 利用同步利用同步tcptcp编写网络聊天程序(续)编写网络聊天程序(续) 运行效果运行效果20203.3 3.3 利用同步利用同步tcptcp编写网络游戏编写网络游戏【例】编写一个可以通过因特网对弈的【例】编写一个可以通过因特网对弈的“吃棋子吃棋子”游戏。游戏。功能要求:功能要求:1) 1) 服务器可以同时服务多桌,每桌允许两个玩家通过因特网对弈。服务器可以同时服务多桌,每桌允许两个玩家通过因特网对弈。2) 2) 允许玩家自由选择坐在哪一桌的哪一方。如果两个玩家坐在同一桌,允许玩家自由选择坐在哪一桌的哪一方。如果两个玩家坐在同一桌,双方应都能看到对方的状态。两个玩家均单击双方应

32、都能看到对方的状态。两个玩家均单击“开始开始”按钮,游戏按钮,游戏就开始了。就开始了。3) 3) 某桌游戏开始后,服务器以固定的时间间隔同时在某桌游戏开始后,服务器以固定的时间间隔同时在15151515的棋盘方的棋盘方格内向该桌随机地发送黑白两种颜色的棋子位置,客户端程序接收格内向该桌随机地发送黑白两种颜色的棋子位置,客户端程序接收到服务器发送的棋子位置和颜色后,在到服务器发送的棋子位置和颜色后,在15151515棋盘的相应位置显示棋盘的相应位置显示棋子。棋子。4) 4) 玩家坐到游戏桌座位上后,不论游戏是否开始,该玩家都可以随时玩家坐到游戏桌座位上后,不论游戏是否开始,该玩家都可以随时调整服

33、务器发送棋子的时间间隔。调整服务器发送棋子的时间间隔。21213.3 3.3 利用同步利用同步tcptcp编写网络游戏(续)编写网络游戏(续)5) 5) 游戏开始后,客户端程序响应鼠标单击。每当玩家单击了某个游戏开始后,客户端程序响应鼠标单击。每当玩家单击了某个棋子,该棋子就会从棋盘上消失,同时具有相应颜色的玩家得棋子,该棋子就会从棋盘上消失,同时具有相应颜色的玩家得1 1分。注意,如果玩家单击了对方颜色的棋子,则对方得分。注意,如果玩家单击了对方颜色的棋子,则对方得1 1分。分。6) 6) 如果两个相同颜色的棋子在水平方向或垂直方向是相邻的,那如果两个相同颜色的棋子在水平方向或垂直方向是相邻

34、的,那么就认为这两个棋子是相邻的。这里不考虑对角线相邻的情况。么就认为这两个棋子是相邻的。这里不考虑对角线相邻的情况。如果相同颜色的棋子出现在相邻的位置,游戏就结束了。该颜色如果相同颜色的棋子出现在相邻的位置,游戏就结束了。该颜色对应的玩家就是失败者。对应的玩家就是失败者。7) 7) 同一桌的两个玩家可以聊天。同一桌的两个玩家可以聊天。 这个游戏虽然比较简单,但却是这个游戏虽然比较简单,但却是“麻雀虽小、五脏俱全麻雀虽小、五脏俱全”。如。如果读者真正理解了编写的方法,就可以轻松编写各类基于果读者真正理解了编写的方法,就可以轻松编写各类基于c/sc/s模模式的因特网应用程序。式的因特网应用程序。

35、 22223.3 3.3 利用同步利用同步tcptcp编写网络游戏(续)编写网络游戏(续) 服务器端编程服务器端编程1.1. 服务器启动服务后,需要创建一个线程专门用于监听玩家服务器启动服务后,需要创建一个线程专门用于监听玩家的连接请求。在监听线程中,服务器一旦接受一个连接,的连接请求。在监听线程中,服务器一旦接受一个连接,就创建一个与该玩家对应的线程,用于接收该玩家发送的就创建一个与该玩家对应的线程,用于接收该玩家发送的信息,并根据该玩家发送的信息提供相应的服务。信息,并根据该玩家发送的信息提供相应的服务。2.2. 有多少个玩家连接,就创建多少个对应的线程。玩家退出有多少个玩家连接,就创建多

36、少个对应的线程。玩家退出游戏室,其对应的线程自动终止。游戏室,其对应的线程自动终止。3.3. 在与每个玩家对应的线程中,服务器收到对应玩家发送的在与每个玩家对应的线程中,服务器收到对应玩家发送的字符串信息后,需要解析字符串的含义,并决定服务器需字符串信息后,需要解析字符串的含义,并决定服务器需要的操作。要的操作。23233.3 3.3 利用同步利用同步tcptcp编写网络游戏(续)编写网络游戏(续) 服务器端设计界面服务器端设计界面图2-1 吃棋子游戏服务器端界面设计24243.3 3.3 利用同步利用同步tcptcp编写网络游戏(续)编写网络游戏(续) 客户端编程客户端编程1.1. 客户端与

37、服务器连接成功后,需要创建一个接收线程,用客户端与服务器连接成功后,需要创建一个接收线程,用于接收服务器发送的信息。在接收线程中,客户端收到服于接收服务器发送的信息。在接收线程中,客户端收到服务器发送的字符串信息后,也需要解析字符串的含义,并务器发送的字符串信息后,也需要解析字符串的含义,并决定需要的操作。决定需要的操作。2.2. 客户端还需要根据服务器发送的命令,及时更新客户端程客户端还需要根据服务器发送的命令,及时更新客户端程序的运行界面序的运行界面 。25253.3 3.3 利用同步利用同步tcptcp编写网络游戏(续)编写网络游戏(续) 客户端设计界面(客户端设计界面(1 1)图2-2

38、 棋子与棋盘图2-3 formroom设计界面26263.3 3.3 利用同步利用同步tcptcp编写网络游戏(续)编写网络游戏(续) 客户端设计界面(客户端设计界面(2 2)2727设计型实验指导设计型实验指导(3 3) 如何实现多机制作如何实现多机制作(讲解源代码)(讲解源代码)28283.4 3.4 异步异步tcptcp应用编程应用编程3.4.1 3.4.1 异步编程模式概述异步编程模式概述.2 2 eventwaithandle eventwaithandle类类.3 3 asyncallback asyncallback委托委托.4 4 be

39、ginaccepttcpclient beginaccepttcpclient与与endaccepttcpclientendaccepttcpclient方法方法.5 5 beginconnect beginconnect与与endconnect endconnect 方法方法.6 6 发送数据发送数据.7 7 接收数据接收数据29293.4.1 3.4.1 异步编程模式概述异步编程模式概述 什么是异步编程什么是异步编程1.1. 异步操作方式:某个工作开始以后,能在这个工作尚未完异步操作方式:某个工作开始以后,能在这个工作尚未完成的时候继续处理其他工作

40、。成的时候继续处理其他工作。 2.2. 异步编程:使用异步编程:使用异步操作方式编写程序。异步操作方式编写程序。3.3. 异步编程用于异步操作执行完成时间可能较长的任务,如异步编程用于异步操作执行完成时间可能较长的任务,如打开大文件、连接远程计算机或查询数据库等。打开大文件、连接远程计算机或查询数据库等。4.4. 异步操作一般在主应用程序线程以外的线程中执行。应用异步操作一般在主应用程序线程以外的线程中执行。应用程序调用异步方法异步执行某个操作时,应用程序可在异程序调用异步方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行。步方法执行其任务时继续执行。30303.4.1 3.4.

41、1 异步编程模式概述(续)异步编程模式概述(续) 在在.net.net中,提供中,提供异步异步处理处理功能的有:功能的有: 1.1.文件文件 i/oi/o、流、流 i/oi/o、套接字、套接字 i/oi/o。2.2.网络。网络。3.3.远程处理信道(远程处理信道(httphttp、tcptcp)和代理。)和代理。4.4.使用使用 asp.net asp.net 创建的创建的 xml web servicesxml web services。5.5.asp.net web asp.net web 窗体。窗体。6.6.使用使用 messagequeue messagequeue 类的消息队列。类的

42、消息队列。7.7.backgroundworkerbackgroundworker等等组件组件 31313.4.1 3.4.1 异步编程模式概述(续)异步编程模式概述(续)异步编程的两种设计模式:异步编程的两种设计模式:1.1.基于基于事件事件的异步设计模式:简化了异步编程复杂度,适用于一般程序员的异步设计模式:简化了异步编程复杂度,适用于一般程序员2.2.基于基于iasyncresultiasyncresult的异步的异步设计模式:功能全,适用于有经验的程序员设计模式:功能全,适用于有经验的程序员基于事件的异步基于事件的异步设计设计模式模式的特点的特点(例子见设计型实验(例子见设计型实验pr

43、emainform.cspremainform.cs)1.1.用事件驱动模型实现异步方法,适用于绝大多数异步应用,降低了异步用事件驱动模型实现异步方法,适用于绝大多数异步应用,降低了异步编程的复杂性。编程的复杂性。建议尽量使用这种设计模式。建议尽量使用这种设计模式。2.2.具有多线程应用程序的优点,同时隐匿了多线程设计中固有的许多复杂具有多线程应用程序的优点,同时隐匿了多线程设计中固有的许多复杂问题。问题。 3.3.在在“后台后台”执行耗时任务(例如下载和数据库操作),但不会中断应用执行耗时任务(例如下载和数据库操作),但不会中断应用程序。程序。4.4.可以可以同时执行多个操作,每个操作完成时

44、都会接到通知。同时执行多个操作,每个操作完成时都会接到通知。5.5.后台后台等待资源等待资源时,时,不会停止(不会停止(“挂起挂起”)应用程序。)应用程序。( (下页继续下页继续) )32323.4.1 3.4.1 异步编程模式概述(续)异步编程模式概述(续)6.6. 使用熟悉的事件和委托模型与挂起的异步操作通信。使用熟悉的事件和委托模型与挂起的异步操作通信。7.7. 支持基于事件的异步模式的类一般都有一个或多个后缀为支持基于事件的异步模式的类一般都有一个或多个后缀为 “ “async” async” 的方法。该类还可能有一个后缀为的方法。该类还可能有一个后缀为“completed”compl

45、eted”的事件,以及后缀的事件,以及后缀为为“asynccancel”asynccancel”(或只(或只有有 cancelasynccancelasync)的方法。)的方法。支持基于事件的异步设计模型的组件或控件举例支持基于事件的异步设计模型的组件或控件举例1.1. pictureboxpicturebox控件:提供了异步的控件:提供了异步的loadasync loadasync 方法,比如异步下载图方法,比如异步下载图像,程序调用像,程序调用loadasyncloadasync方法时,会继续执行方法时,会继续执行该语句后该语句后面的语句,而面的语句,而下载操作将在另一个线程上(后台)进行

46、。下载完成时,线程会自下载操作将在另一个线程上(后台)进行。下载完成时,线程会自动触发动触发loadcompletedloadcompleted事件。基于事件的异步模式要求异步操作可以事件。基于事件的异步模式要求异步操作可以取消,取消,pictureboxpicturebox提供的与之对应的方法名为提供的与之对应的方法名为cancelasynccancelasync。2.2. backgroundworkbackgroundwork组件:能完成绝大多数异步编程功能。建议尽量使组件:能完成绝大多数异步编程功能。建议尽量使用它实现异步操作。用它实现异步操作。3.3. 除了这两个以外,其他很多组件或

47、控件也支持异步操作。例如除了这两个以外,其他很多组件或控件也支持异步操作。例如soundsoundplayerplayer组件、组件、webclientwebclient类等类等33333.4.1 3.4.1 异步编程模式概述(续)异步编程模式概述(续)基于基于iasyncresultiasyncresult的异步的异步设计模式设计模式1.1. 通过前缀分别为通过前缀分别为“begin”begin”和和“end”end”的两个方法实现开始和结束异的两个方法实现开始和结束异步操作,例如步操作,例如filestreamfilestream类提供类提供beginreadbeginread和和endr

48、eadendread方法来从文件方法来从文件异步读取字节。程序在调用异步读取字节。程序在调用beginbegin后,可以在调用线程上继续执行后,可以在调用线程上继续执行其下面的其下面的指令,同时异步操作在另一个线程上执行。指令,同时异步操作在另一个线程上执行。2.2. beginbegin方法开始异步操作,并返回一个实现方法开始异步操作,并返回一个实现 iasyncresultiasyncresult接口的接口的对象。对象。iasyncresultiasyncresult对象存储有关异步操作的状态信息。这些信息对象存储有关异步操作的状态信息。这些信息包括:包括:asyncstateasyncs

49、tate:可选的特定的对象,包含异步操作需要的信息。:可选的特定的对象,包含异步操作需要的信息。asyncwaithandleasyncwaithandle:用:用于于在异步操作完成前阻止程序执行。在异步操作完成前阻止程序执行。completedsynchronouslycompletedsynchronously:指示异步操作是否在用于调用:指示异步操作是否在用于调用beginbegin的的线程上完成,而不是在单独的线程上完成,而不是在单独的threadpoolthreadpool线程上完成。线程上完成。iscompletediscompleted:一个:一个布尔布尔值,指示异步操作是否已完

50、成。值,指示异步操作是否已完成。特点特点1.1. 适用面广、灵活性高、但学习起来比事件设计模式复杂。适用面广、灵活性高、但学习起来比事件设计模式复杂。2.2. 每次调用每次调用beginbegin后,程序还应调用后,程序还应调用endend来获取操作的结果。来获取操作的结果。34343.4.1 3.4.1 异步编程模式概述(续)异步编程模式概述(续)如何理解异步设计模式(对比举例)如何理解异步设计模式(对比举例)实际工作实际工作程序实现程序实现主管人员安主管人员安排排a a负责处理客负责处理客人来访时办理一系列登记手人来访时办理一系列登记手续续程序员编写程序让子线程程序员编写程序让子线程a a

51、负责处理客人来负责处理客人来访时办理一系列登记手续访时办理一系列登记手续没有人来访时,没有人来访时,a a可以到别可以到别处继续做其他事,并约定有处继续做其他事,并约定有人来访时,总控室通过电话人来访时,总控室通过电话通知通知a a子线程执行启动监听的语句(子线程执行启动监听的语句(beginbegin) )后,后,继续执行其下面的语句完成其他功能,同继续执行其下面的语句完成其他功能,同时声明让系统利用时声明让系统利用asynccallbackasynccallback委托执行委托执行(end(end) )方法调用自定义的方法方法调用自定义的方法f f一旦有客人来访,总控室就一旦有客人来访,总

52、控室就会立即给会立即给a a打电话打电话 一旦有客户端请求,系统就会自动执行与一旦有客户端请求,系统就会自动执行与b beginegin对应的对应的endend方法调用方法方法调用方法f fa a接到通知后,在转去处理接到通知后,在转去处理客人来访时需要的登记手续客人来访时需要的登记手续 在自定义的方法在自定义的方法f f中编写程序完成有客户端中编写程序完成有客户端请求时需要处理的工作请求时需要处理的工作35353.4.1 3.4.1 异步编程模式概述(续)异步编程模式概述(续)tcptcp对应的异步操作对应的异步操作1.1. tcplistenertcplistener类类1) begina

53、ccepttcpclient1) beginaccepttcpclient:开始一个异步操作接受一个传入:开始一个异步操作接受一个传入的连接尝试。的连接尝试。2) endaccepttcpclient2) endaccepttcpclient:异步接受传入的连接尝试并创建新:异步接受传入的连接尝试并创建新的的tcpclienttcpclient处理远程主机通信。处理远程主机通信。2.2. tcpclienttcpclient类类1) beginconnect1) beginconnect:开始一个对远程主机连接的异步请求。:开始一个对远程主机连接的异步请求。2) endconnect2) en

54、dconnect:异步接受传入的连接尝试。:异步接受传入的连接尝试。3.3. socketsocket类也有对应的异步操作(见教材表类也有对应的异步操作(见教材表2-32-3)。)。363.2 2 eventwaithandle eventwaithandle类类eventwaithandleeventwaithandle类类用于在异步操作时控制线程间的同步,即控制一个或多个线程是继续执用于在异步操作时控制线程间的同步,即控制一个或多个线程是继续执行还是等待其它线程完成。行还是等待其它线程完成。(例(例3-33-3)异步操作中)异步操作中为什么需要同步(教材为什么需要同步(教材

55、p70-p71p70-p71的例子)的例子)本节例子涉及到的本节例子涉及到的eventwaithandleeventwaithandle类提供的方法:类提供的方法:1.1. resetreset方法方法不让操作系统发出信号,从而导致等待收到信号才能继续执行的线不让操作系统发出信号,从而导致等待收到信号才能继续执行的线程阻塞。程阻塞。2.2. setset方法方法等待的线程将会收到信号,从而继续执行。等待的线程将会收到信号,从而继续执行。3.3. waitonewaitone方法方法等待操作系统为其发出信号,直到收到信号才解除阻塞。等待操作系统为其发出信号,直到收到信号才解除阻塞。37373.4

56、.3.4.2 2 eventwaithandle eventwaithandle类(续)类(续)控制操作系统发出信号的方式有两种:控制操作系统发出信号的方式有两种:1.1. 自动重置方式(自动重置方式(autoreseteventautoresetevent)操作系统自动发信号,使处于等待信号状态的等待队列中的某线程操作系统自动发信号,使处于等待信号状态的等待队列中的某线程解除阻塞,继续执行。解除阻塞,继续执行。 2.2. 手动重置方式(手动重置方式(manualreseteventmanualresetevent)程序员在程序中控制什么时候发信号,使所有等待信号的线程全部程序员在程序中控制什

57、么时候发信号,使所有等待信号的线程全部解除阻塞,继续执行。这种方式下,可以利用解除阻塞,继续执行。这种方式下,可以利用eventwaithandleeventwaithandle类实类实现具体功能,用法:现具体功能,用法:调用调用eventwaithandleeventwaithandle的的setset方法:意思是方法:意思是“发信号发信号” ” 调用调用eventwaithandleeventwaithandle的的resetreset方法:意思是方法:意思是“不要发信号不要发信号” ” 调用调用eventwaithandleeventwaithandle的的waitonewaitone方

58、法:等待某个线程执行完毕方法:等待某个线程执行完毕用法举例用法举例例例3-43-4(教材(教材p72p72代码)代码)383.3 3 asyncallback asyncallback委托委托 用途用途asynccallbackasynccallback委托用于委托用于调用调用异步操作完成时执行的异步操作完成时执行的回调方法回调方法,以,以保证该异步操作完成时能及时通知调用者。保证该异步操作完成时能及时通知调用者。 实现原理实现原理程序调用前缀为程序调用前缀为“begin”begin”的异步操作方法时,系统会自动创建对的异步操作方法时,系统会自动创建对应的线程进行异步操作,从而

59、保证调用方和被调用方同时执行,当应的线程进行异步操作,从而保证调用方和被调用方同时执行,当前缀为前缀为“begin”begin”的方法执行完毕时,系统会自动通过的方法执行完毕时,系统会自动通过asynccallbaasynccallbackck委托调用在委托调用在beginbegin方法的参数中指定的回调方法。方法的参数中指定的回调方法。 用法说明用法说明回调方法是在程序中事先定义的,在回调方法中,通过回调方法是在程序中事先定义的,在回调方法中,通过endend方法方法获取获取beginbegin方法的返回值和所有输入方法的返回值和所有输入/ /输出参数,从而达到异步操输出参数,从而达到异步操

60、作方式下完成参数传递的目的。作方式下完成参数传递的目的。39393.4.4 beginaccepttcpclient3.4.4 beginaccepttcpclient与与endaccepttcpclientendaccepttcpclient方法方法 两个方法均在两个方法均在system.net.socketssystem.net.sockets命名空间下的命名空间下的tcplistenertcplistener类中。类中。 实现原理实现原理在在beginaccepttcpclientbeginaccepttcpclient方法中,系统会自动创建需要的线程(不一方法中,系统会自动创建需要的线

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论