版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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.1.3 TcpClient3.1.3 TcpClient类与类与TcpListenerTcpListener类类3.1.4 NetworkStream3.1.4 NetworkStream类类3.1.5 3.1.5 处理处理TCPTCP协议的无音讯边境问题协议的无音讯边境问题3 33.1.1 TCP3.1.1 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编写效力器端运用程序的普通步骤为:编写效力器端运用程序的普通步骤为: 创建一个包含采用的网络类型、数据传输类型和协议类型的创建一个包含采用的网络类型、数据传输类型和协议类型的TcpListeTcpListenerner对象,在指定的端口进展监听
5、。对象,在指定的端口进展监听。接受客户端的衔接恳求,根据客户端发送的衔接信息创建与该客户端接受客户端的衔接恳求,根据客户端发送的衔接信息创建与该客户端对应的对应的TcpClientTcpClient对象。对象。根据创建的根据创建的TcpClientTcpClient对象,利用对象,利用TcpClientTcpClient对象的对象的GetStreamGetStream方法得方法得到到NetworkStreamNetworkStream对象,然后利用对象,然后利用NetworkStreamNetworkStream对象的对象的WriteWrite方法和方法和R Readead方法分别与每个衔接的
6、客户进展数据传输。方法分别与每个衔接的客户进展数据传输。与对方通讯终了后,封锁与对方的衔接,释放与与对方通讯终了后,封锁与对方的衔接,释放与TcpClientTcpClient关联的一关联的一切资源。切资源。5 53.1.2 3.1.2 同步同步TCPTCP运用编程的普通步骤续运用编程的普通步骤续 运用同步运用同步TCPTCP编写客户端程序的普通步骤为:编写客户端程序的普通步骤为: 创建一个包含传输过程中采用的网络类型、数据传输类型创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的和协议类型的TcpClientTcpClient对象。对象。 调用调用TcpClientTcpClie
7、nt对象的对象的ConnectConnect方法与远程效力器建立衔接。方法与远程效力器建立衔接。 利用利用TcpClientTcpClient对象的对象的GetStreamGetStream方法得到方法得到NetworkStreamNetworkStream对象,然后利用对象,然后利用NetworkStreamNetworkStream对象的对象的WriteWrite方法和方法和ReadRead方方法与效力器进展数据传输。法与效力器进展数据传输。 完成任务后,向效力器发送封锁信息,并封锁与效力器的完成任务后,向效力器发送封锁信息,并封锁与效力器的衔接,释放相应资源。衔接,释放相应资源。6 63
8、.1.3 TcpClient3.1.3 TcpClient与与TcpListenerTcpListener 两个类均封装了底层的套接字,并分别提供了对套接字进两个类均封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了一步封装后的同步和异步操作的方法,降低了TCPTCP运用编运用编程的难度。程的难度。 TcpClientTcpClient类用于提供本地主机和远程主机的衔接、发送类用于提供本地主机和远程主机的衔接、发送和接纳流数据。和接纳流数据。 TcpListenerTcpListener类用于侦听和接受传入的衔接恳求。类用于侦听和接受传入的衔接恳求。7 73.1
9、.3 TcpClient3.1.3 TcpClient与与TcpListenerTcpListener续续TcpClientTcpClient类类TcpClientTcpClient类在类在System.Net.SocketSystem.Net.Socket命名空间下。命名空间下。编写客户端程序时,需求直接利用构造函数创建编写客户端程序时,需求直接利用构造函数创建TcpClientTcpClient对象。对象。构造函数有四种重载方式见课本构造函数有四种重载方式见课本编写客户端程序时,常用方式为:编写客户端程序时,常用方式为:TcpClient tcpClient=new TcpClient(T
10、cpClient tcpClient=new TcpClient(“abcdabcd, 51888) , 51888) 它相当于:它相当于:T c p C l i e n t t c p C l i e n t = n e w T c p C l i e n t ( ) ;T c p C l i e n t t c p C l i e n t = n e w T c p C l i e n t ( ) ;tcpClient.Connect(abcd, 51888);tcpClient.Connect(abcd, 51888);编写效力器端程序时,不需求直接运用其构造函数创建编写效力器端程序时,
11、不需求直接运用其构造函数创建TcpClientTcpClient对象,对象,而是利用而是利用TcpListenerTcpListener对象的对象的AcceptTcpClientAcceptTcpClient方法得到与该远程主机对方法得到与该远程主机对应的应的TcpClientTcpClient对象。对象。8 83.1.3 TcpClient3.1.3 TcpClient与与TcpListenerTcpListener续续 TcpClient类的常用属性属性含义Client获取或设置基础套接字LingerState获取或设置Close调用后仍保持打开的时间NoDelay获取或设置一个值,该值在
12、发送或接收缓冲区未满时禁用延迟(true禁用延迟,默认false) ReceiveBufferSize获取或设置接收缓冲区的大小(默认8192字节)ReceiveTimeout获取或设置套接字接收数据的超时时间(毫秒)SendBufferSize获取或设置发送缓冲区的大小(默认8192字节)SendTimeout获取或设置套接字发送数据的超时时间(毫秒)9 93.1.3 TcpClient3.1.3 TcpClient与与TcpListenerTcpListener续续 在同步任务方式下,TcpClient类的常用方法方法含义Close关闭TcpClient实例,而不关闭基础连接Connect
13、用指定的主机名和端口号将客户端连接到TCP主机GetStream获取发送和接收数据的NetworkStream对象10103.1.3 TcpClient3.1.3 TcpClient与与TcpListenerTcpListener续续 TcpClientTcpClient用法举例:用法举例: TcpClient tcpClient = new TcpClient();TcpClient tcpClient = new TcpClient(); tcpClient.Connect(contosoServer, 11000);tcpClient.Connect(contosoServer, 110
14、00); NetworkStream networkStream = tcpClient.GetStream();NetworkStream networkStream = tcpClient.GetStream(); networkStream.ReadTimeout = 10;networkStream.ReadTimeout = 10; byte bytes = new byte1024;byte bytes = new byte1024; networkStream.Read(bytes, 0, 1024);networkStream.Read(bytes, 0, 1024); str
15、ing data = Encoding.UTF8.GetString(bytes); string data = Encoding.UTF8.GetString(bytes); networkStream.Close();networkStream.Close(); tcpClient.Close(); tcpClient.Close(); 11113.1.3 TcpClient3.1.3 TcpClient与与TcpListenerTcpListener类续类续TcpListenerTcpListener类类TcpLISTenerTcpLISTener类在类在System.Net.Socke
16、tSystem.Net.Socket命名空间下。用于监听和接受传入命名空间下。用于监听和接受传入的衔接恳求。的衔接恳求。构造函数见课本,常用构造函数:构造函数见课本,常用构造函数:TcpListener(IPAddress localAddr, int port)TcpListener(IPAddress localAddr, int port)举例:举例:IPAddress ipAddress = Dns.Resolve(localhost).AddressList0;IPAddress ipAddress = Dns.Resolve(localhost).AddressList0;TryT
17、ry 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.ToString(); 12123.1.3 TcpClient3.1.3 TcpClient与与TcpListenerTcpListener类续类续在同步任务方式下
18、,在同步任务方式下, TcpListenerTcpListener类常用的方法:类常用的方法:AcceptTcpClientAcceptTcpClient在同步阻塞方式下获取并前往一个可以用来接纳和发送数据的封装了在同步阻塞方式下获取并前往一个可以用来接纳和发送数据的封装了SocketSocket的的TcpClientTcpClient对象对象 ;StartStart启动监听,构造函数为:启动监听,构造函数为:public void Start(int backlog)public void Start(int backlog)参数参数backlogbacklog为恳求队列的最大长度,即最多允
19、许的在排队队列中的为恳求队列的最大长度,即最多允许的在排队队列中的客户端恳求衔接个数;客户端恳求衔接个数;StopStop停顿监听恳求,构造函数为:停顿监听恳求,构造函数为:public void Stop();public void Stop();补充补充TcpServerChannelTcpServerChannel类:在分布式处置中,为远程调用实现运用类:在分布式处置中,为远程调用实现运用 TCP TCP 协议传输音讯的效力器信道。协议传输音讯的效力器信道。13133.1.4 NetworkStream3.1.4 NetworkStream类类 NetworkStreamNetworkS
20、tream类提供用于网络访问的根底数据流,即提供在阻塞方式类提供用于网络访问的根底数据流,即提供在阻塞方式下经过套接字发送和接纳数据的方法。下经过套接字发送和接纳数据的方法。 根本用法见课本根本用法见课本 NetworkStream networkStream = new NetworkStream(clientSockeNetworkStream networkStream = new NetworkStream(clientSocket );t ); string message = string message = 发送的数据发送的数据; byte sendbytes = System.
21、Text.Encoding.UTF8.GetBytes(messagbyte sendbytes = System.Text.Encoding.UTF8.GetBytes(message );e ); networkStream.Write(sendbytes ,0, sendbytes.Length );networkStream.Write(sendbytes ,0, sendbytes.Length ); byte readbytes = new byte1024;byte readbytes = new byte1024; int i = networkStream.Read(read
22、bytes, 0, readbytes.Length);int i = networkStream.Read(readbytes, 0, readbytes.Length); 阐明:对于同步阐明:对于同步TCPTCP运用编程,直接运用运用编程,直接运用NetworkStreamNetworkStream对象进展通讯对象进展通讯依然比较复杂,所以普通利用该对象得到其他更简单的对象,然后利依然比较复杂,所以普通利用该对象得到其他更简单的对象,然后利用这些更简单的对象实现通讯,比如用这些更简单的对象实现通讯,比如BinaryReaderBinaryReader对象、对象、BinaryWriteBin
23、aryWriteerer对象、对象、StreamReaderStreamReader对象、对象、StreamWriterStreamWriter对象等。对象等。14143.1.4 NetworkStream3.1.4 NetworkStream类续类续WriteWrite方法:方法:NetworkStreamNetworkStream对象的对象的WriteWrite方法的前往值为方法的前往值为voidvoid,该对象之所以不前往,该对象之所以不前往实践发送的字节数,是由于能保证字节数组中的数据全部发送到实践发送的字节数,是由于能保证字节数组中的数据全部发送到TCPTCP发送发送缓冲区中。缓冲区
24、中。 在运用在运用NetworkStreamNetworkStream对象的对象的WriteWrite方法前最好先检测方法前最好先检测NetworkStreamNetworkStream对象对象的的WriteableWriteable属性能否为属性能否为TrueTrue。 假设发送的全部是单行文本信息,创建假设发送的全部是单行文本信息,创建NetworkStreamNetworkStream对象后,运用对象后,运用StreStreamReaderamReader和和StreamWriterStreamWriter的的ReadLineReadLine和和WriteLineWriteLine方法更
25、简单。方法更简单。ReadRead方法:方法:调用调用NetworkStreamNetworkStream类的类的ReadRead方法前应确保方法前应确保NetworkStreamNetworkStream对象的对象的CanReadCanRead属性值有效属性值有效由于有能够由于有能够TCPTCP接纳缓冲区还没有接纳到对方发送过来的指定长度的数据,接纳缓冲区还没有接纳到对方发送过来的指定长度的数据,所以所以ReadRead方法有一个整型的前往值。方法有一个整型的前往值。假设远程主机封锁了套接字衔接,并且此时有效数据曾经被完全接纳,假设远程主机封锁了套接字衔接,并且此时有效数据曾经被完全接纳,那
26、么那么ReadRead方法的前往值将会是方法的前往值将会是0 0字节。字节。15153.1.5 3.1.5 处理处理TCPTCP协议的无音讯边境问题协议的无音讯边境问题在网络传输中,能够会出现发送方一次发送的音讯与接纳方一在网络传输中,能够会出现发送方一次发送的音讯与接纳方一次接纳的音讯不一致的景象。这主要是由于次接纳的音讯不一致的景象。这主要是由于TCPTCP协议是字节流方协议是字节流方式的、无音讯边境的协议,由于受网络传输中的不确定要素的式的、无音讯边境的协议,由于受网络传输中的不确定要素的影响,因此不能保证单个影响,因此不能保证单个SendSend方法发送的数据被单个方法发送的数据被单个
27、ReceiveReceive方方法读取。法读取。实践运用中,处理实践运用中,处理TCPTCP协议音讯边境问题的方法有三种:协议音讯边境问题的方法有三种:发送固定长度的音讯。该方法适用于音讯长度固定的场所。发送固定长度的音讯。该方法适用于音讯长度固定的场所。将音讯长度与音讯一同发送。将音讯长度与音讯一同发送。运用特殊标志分隔音讯。运用特殊标志分隔音讯。16163.2 3.2 利用同步利用同步TCPTCP编写网络聊天程序编写网络聊天程序利用同步利用同步TCPTCP和和BinaryReaderBinaryReader及及BinaryWriterBinaryWriter对象编写一个简单的对象编写一个简
28、单的网络聊天程序。功能要求:网络聊天程序。功能要求:任何一个客户端,均可以与效力器进展通讯。任何一个客户端,均可以与效力器进展通讯。效力器要能显示客户端衔接的形状,当客户端衔接胜利后,要自效力器要能显示客户端衔接的形状,当客户端衔接胜利后,要自动及时告知客户端曾经衔接胜利的信息。动及时告知客户端曾经衔接胜利的信息。客户端和效力器建立衔接后,即可以和效力器聊天。客户端和效力器建立衔接后,即可以和效力器聊天。将实验改为:一个客户和其他任一个客户聊天,用将实验改为:一个客户和其他任一个客户聊天,用StreamReadeStreamReader r和和StreamWriterStreamWriter对
29、象实现字符串的接纳和发送对象实现字符串的接纳和发送不论客户端何时退出程序,效力器都要做出正确判别,并显示该不论客户端何时退出程序,效力器都要做出正确判别,并显示该客户衔接和断开衔接的情况。客户衔接和断开衔接的情况。 17173.2 3.2 利用同步利用同步TCPTCP编写网络聊天程序续编写网络聊天程序续 效力器端设计界面详细代码见实验教材效力器端设计界面详细代码见实验教材( (实验实验8)8)的源程序的源程序效力器端设计界面buttonStarttextBoxSendcomboBoxReceiverbuttonStopbuttonSend18183.2 3.2 利用同步利用同步TCPTCP编写
30、网络聊天程序续编写网络聊天程序续 客户端设计界面详细代码见实验教材客户端设计界面详细代码见实验教材( (实验实验8)8)的源程序的源程序聊天客户端设计界面textBoxSendbuttonConnectbuttonSend19193.2 3.2 利用同步利用同步TCPTCP编写网络聊天程序续编写网络聊天程序续 运转效果运转效果20203.3 3.3 利用同步利用同步TCPTCP编写网络游戏编写网络游戏【例】编写一个可以经过因特网对弈的【例】编写一个可以经过因特网对弈的“吃棋子游戏。吃棋子游戏。功能要求:功能要求:1) 1) 效力器可以同时效力多桌,每桌允许两个玩家经过因特网对弈。效力器可以同时
31、效力多桌,每桌允许两个玩家经过因特网对弈。2) 2) 允许玩家自在选择坐在哪一桌的哪一方。假设两个玩家坐在同一桌,允许玩家自在选择坐在哪一桌的哪一方。假设两个玩家坐在同一桌,双方应都能看到对方的形状。两个玩家均单击双方应都能看到对方的形状。两个玩家均单击“开场按钮,游戏开场按钮,游戏就开场了。就开场了。3) 3) 某桌游戏开场后,效力器以固定的时间间隔同时在某桌游戏开场后,效力器以固定的时间间隔同时在15151515的棋盘方的棋盘方格内向该桌随机地发送黑白两种颜色的棋子位置,客户端程序接纳格内向该桌随机地发送黑白两种颜色的棋子位置,客户端程序接纳到效力器发送的棋子位置和颜色后,在到效力器发送的
32、棋子位置和颜色后,在15151515棋盘的相应位置显示棋盘的相应位置显示棋子。棋子。4) 4) 玩家坐到游戏桌座位上后,不论游戏能否开场,该玩家都可以随时玩家坐到游戏桌座位上后,不论游戏能否开场,该玩家都可以随时调整效力器发送棋子的时间间隔。调整效力器发送棋子的时间间隔。21213.3 3.3 利用同步利用同步TCPTCP编写网络游戏续编写网络游戏续5) 5) 游戏开场后,客户端程序呼应鼠标单击。每当玩家单击了某个游戏开场后,客户端程序呼应鼠标单击。每当玩家单击了某个棋子,该棋子就会从棋盘上消逝,同时具有相应颜色的玩家得棋子,该棋子就会从棋盘上消逝,同时具有相应颜色的玩家得1 1分。留意,假设
33、玩家单击了对方颜色的棋子,那么对方得分。留意,假设玩家单击了对方颜色的棋子,那么对方得1 1分。分。6) 6) 假设两个一样颜色的棋子在程度方向或垂直方向是相邻的,那假设两个一样颜色的棋子在程度方向或垂直方向是相邻的,那么就以为这两个棋子是相邻的。这里不思索对角线相邻的情况。么就以为这两个棋子是相邻的。这里不思索对角线相邻的情况。假设一样颜色的棋子出如今相邻的位置,游戏就终了了。该颜色假设一样颜色的棋子出如今相邻的位置,游戏就终了了。该颜色对应的玩家就是失败者。对应的玩家就是失败者。7) 7) 同一桌的两个玩家可以聊天。同一桌的两个玩家可以聊天。 这个游戏虽然比较简单,但却是这个游戏虽然比较简
34、单,但却是“麻雀虽小、五脏俱全。假麻雀虽小、五脏俱全。假设读者真正了解了编写的方法,就可以轻松编写各类基于设读者真正了解了编写的方法,就可以轻松编写各类基于C/SC/S方方式的因特网运用程序。式的因特网运用程序。 22223.3 3.3 利用同步利用同步TCPTCP编写网络游戏续编写网络游戏续 效力器端编程效力器端编程 效力器启动效力后,需求创建一个线程专门用于监听玩家效力器启动效力后,需求创建一个线程专门用于监听玩家的衔接恳求。在监听线程中,效力器一旦接受一个衔接,的衔接恳求。在监听线程中,效力器一旦接受一个衔接,就创建一个与该玩家对应的线程,用于接纳该玩家发送的就创建一个与该玩家对应的线程
35、,用于接纳该玩家发送的信息,并根据该玩家发送的信息提供相应的效力。信息,并根据该玩家发送的信息提供相应的效力。 有多少个玩家衔接,就创建多少个对应的线程。玩家退出有多少个玩家衔接,就创建多少个对应的线程。玩家退出游戏室,其对应的线程自动终止。游戏室,其对应的线程自动终止。 在与每个玩家对应的线程中,效力器收到对应玩家发送的在与每个玩家对应的线程中,效力器收到对应玩家发送的字符串信息后,需求解析字符串的含义,并决议效力器需字符串信息后,需求解析字符串的含义,并决议效力器需求的操作。求的操作。23233.3 3.3 利用同步利用同步TCPTCP编写网络游戏续编写网络游戏续 效力器端设计界面效力器端
36、设计界面图2-1 吃棋子游戏效力器端界面设计24243.3 3.3 利用同步利用同步TCPTCP编写网络游戏续编写网络游戏续 客户端编程客户端编程 客户端与效力器衔接胜利后,需求创建一个接纳线程,用客户端与效力器衔接胜利后,需求创建一个接纳线程,用于接纳效力器发送的信息。在接纳线程中,客户端收到效于接纳效力器发送的信息。在接纳线程中,客户端收到效力器发送的字符串信息后,也需求解析字符串的含义,并力器发送的字符串信息后,也需求解析字符串的含义,并决议需求的操作。决议需求的操作。 客户端还需求根据效力器发送的命令,及时更新客户端程客户端还需求根据效力器发送的命令,及时更新客户端程序的运转界面序的运
37、转界面 。25253.3 3.3 利用同步利用同步TCPTCP编写网络游戏续编写网络游戏续 客户端设计界面客户端设计界面1 1图2-2 棋子与棋盘图2-3 FormRoom设计界面26263.3 3.3 利用同步利用同步TCPTCP编写网络游戏续编写网络游戏续 客户端设计界面客户端设计界面2 22727设计型实验指点设计型实验指点3 3 如何实现多机制造如何实现多机制造讲解源代码讲解源代码28283.4 3.4 异步异步TCPTCP运用编程运用编程3.4.1 3.4.1 异步编程方式概述异步编程方式概述3.4.2 EventWaitHandle3.4.2 EventWaitHandle类类3.
38、4.3 AsynCallback3.4.3 AsynCallback委托委托3.4.4 BeginAcceptTcpClient3.4.4 BeginAcceptTcpClient与与EndAcceptTcpClientEndAcceptTcpClient方法方法3.4.5 BeginConnect3.4.5 BeginConnect与与EndConnect EndConnect 方法方法3.4.6 3.4.6 发送数据发送数据3.4.7 3.4.7 接纳数据接纳数据29293.4.1 3.4.1 异步编程方式概述异步编程方式概述 什么是异步编程什么是异步编程 异步操作方式:某个任务开场以后,
39、能在这个任务尚未完成异步操作方式:某个任务开场以后,能在这个任务尚未完成的时候继续处置其他任务。的时候继续处置其他任务。 异步编程:运用异步操作方式编写程序。异步编程:运用异步操作方式编写程序。 异步编程用于异步操作执行完成时间能够较长的义务,如翻异步编程用于异步操作执行完成时间能够较长的义务,如翻开大文件、衔接远程计算机或查询数据库等。开大文件、衔接远程计算机或查询数据库等。 异步操作普通在主运用程序线程以外的线程中执行。运用程异步操作普通在主运用程序线程以外的线程中执行。运用程序调用异步方法异步执行某个操作时,运用程序可在异步方序调用异步方法异步执行某个操作时,运用程序可在异步方法执行其义
40、务时继续执行。法执行其义务时继续执行。30303.4.1 3.4.1 异步编程方式概述续异步编程方式概述续 在在.NET.NET中,提供异步处置功能的有:中,提供异步处置功能的有: 文件文件 I/OI/O、流、流 I/OI/O、套接字、套接字 I/OI/O。 网络。网络。 远程处置信道、远程处置信道、TCPTCP和代理。和代理。 运用运用 ASP.NET ASP.NET 创建的创建的 XML Web servicesXML Web services。 ASP.NET Web ASP.NET Web 窗体。窗体。 运用运用 MessageQueue MessageQueue 类的音讯队列。类的音
41、讯队列。 BackgroundWorkerBackgroundWorker等组件等组件 31313.4.1 3.4.1 异步编程方式概述续异步编程方式概述续异步编程的两种设计方式:异步编程的两种设计方式:基于事件的异步设计方式:简化了异步编程复杂度,适用于普通程序员基于事件的异步设计方式:简化了异步编程复杂度,适用于普通程序员基于基于IAsyncResultIAsyncResult的异步设计方式:功能全,适用于有阅历的程序员的异步设计方式:功能全,适用于有阅历的程序员基于事件的异步设计方式的特点例子见设计型实验基于事件的异步设计方式的特点例子见设计型实验preMainForm.cspreMai
42、nForm.cs用事件驱动模型实现异步方法,适用于绝大多数异步运用,降低了异步编程用事件驱动模型实现异步方法,适用于绝大多数异步运用,降低了异步编程的复杂性。建议尽量运用这种设计方式。的复杂性。建议尽量运用这种设计方式。具有多线程运用程序的优点,同时隐匿了多线程设计中固有的许多复杂问题。具有多线程运用程序的优点,同时隐匿了多线程设计中固有的许多复杂问题。 在在“后台执行耗时义务例如下载和数据库操作,但不会中断运用程序。后台执行耗时义务例如下载和数据库操作,但不会中断运用程序。可以同时执行多个操作,每个操作完成时都会接到通知。可以同时执行多个操作,每个操作完成时都会接到通知。后台等待资源时,不会
43、停顿后台等待资源时,不会停顿“挂起运用程序。挂起运用程序。( (下页继续下页继续) )32323.4.1 3.4.1 异步编程方式概述续异步编程方式概述续u 运用熟习的事件和委托模型与挂起的异步操作通讯。运用熟习的事件和委托模型与挂起的异步操作通讯。u 支持基于事件的异步方式的类普通都有一个或多个后缀为支持基于事件的异步方式的类普通都有一个或多个后缀为 “AsyncAsync 的方法。该类还能够有一个后缀为的方法。该类还能够有一个后缀为“CompletedCompleted的事件,以及的事件,以及后缀为后缀为“AsyncCancelAsyncCancel或只需或只需 CancelAsync C
44、ancelAsync的方法。的方法。u 支持基于事件的异步设计模型的组件或控件举例支持基于事件的异步设计模型的组件或控件举例u PictureBoxPictureBox控件:提供了异步的控件:提供了异步的LoadAsync LoadAsync 方法,比如异步下载方法,比如异步下载图像,程序调用图像,程序调用LoadAsyncLoadAsync方法时,会继续执行该语句后面的语句,方法时,会继续执行该语句后面的语句,而下载操作将在另一个线程上后台进展。下载完成时,线程而下载操作将在另一个线程上后台进展。下载完成时,线程会自动触发会自动触发LoadCompletedLoadCompleted事件。基
45、于事件的异步方式要求异步操事件。基于事件的异步方式要求异步操作可以取消,作可以取消,PictureBoxPictureBox提供的与之对应的方法名为提供的与之对应的方法名为CancelAsyncCancelAsync。u BackgroundWorkBackgroundWork组件:能完成绝大多数异步编程功能。建议尽量组件:能完成绝大多数异步编程功能。建议尽量运用它实现异步操作。运用它实现异步操作。u 除了这两个以外,其他很多组件或控件也支持异步操作。例如除了这两个以外,其他很多组件或控件也支持异步操作。例如SouSoundPlayerndPlayer组件、组件、WebClientWebCli
46、ent类等类等33333.4.1 3.4.1 异步编程方式概述续异步编程方式概述续基于基于IAsyncResultIAsyncResult的异步设计方式的异步设计方式经过前缀分别为经过前缀分别为“BeginBegin和和“EndEnd的两个方法实现开场和终了异步操作,的两个方法实现开场和终了异步操作,例如例如FileStreamFileStream类提供类提供BeginReadBeginRead和和EndReadEndRead方法来从文件异步读取字节。方法来从文件异步读取字节。程序在调用程序在调用BeginBegin后,可以在调用线程上继续执行其下面的指令,同时后,可以在调用线程上继续执行其下
47、面的指令,同时异步操作在另一个线程上执行。异步操作在另一个线程上执行。BeginBegin方法开场异步操作,并前往一个实现方法开场异步操作,并前往一个实现 IAsyncResult IAsyncResult接口的对象。接口的对象。IAsyncResultIAsyncResult对象存储有关异步操作的形状信息。这些信息包括:对象存储有关异步操作的形状信息。这些信息包括:AsyncStateAsyncState:可选的特定的对象,包含异步操作需求的信息。:可选的特定的对象,包含异步操作需求的信息。AsyncWaitHandleAsyncWaitHandle:用于在异步操作完成前阻止程序执行。:用于
48、在异步操作完成前阻止程序执行。CompletedSynchronouslyCompletedSynchronously:指示异步操作能否在用于调用:指示异步操作能否在用于调用BeginBegin的线程的线程上完成,而不是在单独的上完成,而不是在单独的ThreadPoolThreadPool线程上完成。线程上完成。IsCompletedIsCompleted:一个布尔值,指示异步操作能否已完成。:一个布尔值,指示异步操作能否已完成。特点特点适用面广、灵敏性高、但学习起来比事件设计方式复杂。适用面广、灵敏性高、但学习起来比事件设计方式复杂。每次调用每次调用BeginBegin后,程序还应调用后,程
49、序还应调用EndEnd来获取操作的结果。来获取操作的结果。34343.4.1 3.4.1 异步编程方式概述续异步编程方式概述续如何了解异步设计方式对比举例实际工作实际工作程序实现程序实现主管人员安主管人员安排排A A负责处理客负责处理客人来访时办理一系列登记手人来访时办理一系列登记手续续程序员编写程序让子线程程序员编写程序让子线程A A负责处理客人来负责处理客人来访时办理一系列登记手续访时办理一系列登记手续没有人来访时,没有人来访时,A A可以到别可以到别处继续做其他事,并约定有处继续做其他事,并约定有人来访时,总控室通过电话人来访时,总控室通过电话通知通知A A子线程执行启动监听的语句(子线
50、程执行启动监听的语句(Begin)Begin)后,后,继续执行其下面的语句完成其他功能,同继续执行其下面的语句完成其他功能,同时声明让系统利用时声明让系统利用AsynccallbackAsynccallback委托执行委托执行(End)(End)方法调用自定义的方法方法调用自定义的方法F F一旦有客人来访,总控室就一旦有客人来访,总控室就会立即给会立即给A A打电话打电话 一旦有客户端请求,系统就会自动执行与一旦有客户端请求,系统就会自动执行与B Beginegin对应的对应的EndEnd方法调用方法方法调用方法F FA A接到通知后,在转去处理接到通知后,在转去处理客人来访时需要的登记手续客
51、人来访时需要的登记手续 在自定义的方法在自定义的方法F F中编写程序完成有客户端中编写程序完成有客户端请求时需要处理的工作请求时需要处理的工作35353.4.1 3.4.1 异步编程方式概述续异步编程方式概述续TCPTCP对应的异步操作对应的异步操作TcpListenerTcpListener类类1) BeginAcceptTcpClient1) BeginAcceptTcpClient:开场一个异步操作接受一个传入的衔:开场一个异步操作接受一个传入的衔接尝试。接尝试。2) EndAcceptTcpClient2) EndAcceptTcpClient:异步接受传入的衔接尝试并创建新的:异步接
52、受传入的衔接尝试并创建新的TcTcpClientpClient处置远程主机通讯。处置远程主机通讯。TcpClientTcpClient类类1) BeginConnect1) BeginConnect:开场一个对远程主机衔接的异步恳求。:开场一个对远程主机衔接的异步恳求。2) EndConnect2) EndConnect:异步接受传入的衔接尝试。:异步接受传入的衔接尝试。SocketSocket类也有对应的异步操作见教材表类也有对应的异步操作见教材表2-32-3。36363.4.2 EventWaitHandle3.4.2 EventWaitHandle类类EventWaitHandleEve
53、ntWaitHandle类类用于在异步操作时控制线程间的同步,即控制一个或多个线程是继续执用于在异步操作时控制线程间的同步,即控制一个或多个线程是继续执行还是等待其它线程完成。行还是等待其它线程完成。例例3-33-3异步操作中为什么需求同步教材异步操作中为什么需求同步教材P70-P71P70-P71的例子的例子本节例子涉及到的本节例子涉及到的EventWaitHandleEventWaitHandle类提供的方法:类提供的方法:ResetReset方法方法不让操作系统发出信号,从而导致等待收到信号才干继续执行的线程阻不让操作系统发出信号,从而导致等待收到信号才干继续执行的线程阻塞。塞。SetS
54、et方法方法等待的线程将会收到信号,从而继续执行。等待的线程将会收到信号,从而继续执行。WaitOneWaitOne方法方法等待操作系统为其发出信号,直到收到信号才解除阻塞。等待操作系统为其发出信号,直到收到信号才解除阻塞。37373.4.2 EventWaitHandle3.4.2 EventWaitHandle类续类续控制操作系统发出信号的方式有两种:控制操作系统发出信号的方式有两种:自动重置方式自动重置方式AutoResetEventAutoResetEvent操作系统自动发信号,使处于等待信号形状的等待队列中的某线程解除操作系统自动发信号,使处于等待信号形状的等待队列中的某线程解除阻塞
55、,继续执行。阻塞,继续执行。 手动重置方式手动重置方式ManualResetEventManualResetEvent程序员在程序中控制什么时候发信号,使一切等待信号的线程全部解除程序员在程序中控制什么时候发信号,使一切等待信号的线程全部解除阻塞,继续执行。这种方式下,可以利用阻塞,继续执行。这种方式下,可以利用EventWaitHandleEventWaitHandle类实现详细功类实现详细功能,用法:能,用法:调用调用EventWaitHandleEventWaitHandle的的SetSet方法:意思是方法:意思是“发信号发信号 调用调用EventWaitHandleEventWaitH
56、andle的的ResetReset方法:意思是方法:意思是“不要发信号不要发信号 调用调用EventWaitHandleEventWaitHandle的的WaitOneWaitOne方法:等待某个线程执行终了方法:等待某个线程执行终了用法举例用法举例例例3-43-4教材教材P72P72代码代码38383.4.3 AsynCallback3.4.3 AsynCallback委托委托 用途用途AsyncCallbackAsyncCallback委托用于调用异步操作完成时执行的回调方法,以委托用于调用异步操作完成时执行的回调方法,以保证该异步操作完成时能及时通知调用者。保证该异步操作完成时能及时通知
57、调用者。 实现原理实现原理程序调用前缀为程序调用前缀为“BeginBegin的异步操作方法时,系统会自动创建对应的异步操作方法时,系统会自动创建对应的线程进展异步操作,从而保证调用方和被调用方同时执行,当前的线程进展异步操作,从而保证调用方和被调用方同时执行,当前缀为缀为“BeginBegin的方法执行终了时,系统会自动经过的方法执行终了时,系统会自动经过AsyncCallbackAsyncCallback委托调用在委托调用在BeginBegin方法的参数中指定的回调方法。方法的参数中指定的回调方法。 用法阐明用法阐明回调方法是在程序中事先定义的,在回调方法中,经过回调方法是在程序中事先定义的
58、,在回调方法中,经过EndEnd方法方法获取获取BeginBegin方法的前往值和一切输入方法的前往值和一切输入/ /输出参数,从而到达异步操输出参数,从而到达异步操作方式下完成参数传送的目的。作方式下完成参数传送的目的。39393.4.4 BeginAcceptTcpClient3.4.4 BeginAcceptTcpClient与与EndAcceptTcpClientEndAcceptTcpClient方法方法 两个方法均在两个方法均在System.Net.SocketsSystem.Net.Sockets命名空间下的命名空间下的TcpListenerTcpListener类中。类中。 实
59、现原理实现原理在在BeginAcceptTcpClientBeginAcceptTcpClient方法中,系统会自动创建需求的线程不一方法中,系统会自动创建需求的线程不一定是线程池,同时监听客户端衔接恳求。一旦定是线程池,同时监听客户端衔接恳求。一旦BeginBegin方法接受了客方法接受了客户衔接恳求,就自动经过委托户衔接恳求,就自动经过委托(callback(callback参数参数) )调用提供的方法,并将调用提供的方法,并将形状信息形状信息(state(state参数参数) )提供应提供应EndEnd方法。方法。 方法原型方法原型 public IAsyncResult BeginAc
60、ceptTcpClient(AsyncCallback call public IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, Object state)back, Object state) 其中:参数其中:参数1 1为为AsyncCallbackAsyncCallback类型的委托;类型的委托; 参数参数2 2为为ObjectObject类型的对象,用于传送形状信息。类型的对象,用于传送形状信息。 例如:例如: AsyncCallback callback = new AsyncCallback(AcceptTcpClie
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年税务会计咨询合同
- 银行网点租赁合同模板
- 空气净化设备租赁协议样本
- 排水管道管涵施工合同
- 超市收银区地砖铺装项目协议
- 医院防雷施工合同
- 商场卫生清洁工招聘合同
- 未婚夫婚前房产协议
- 养老院租赁协议
- 通信工程商品混凝土施工协议
- 第六单元《多边形的面积》 单元测试(含答案)2024-2025学年人教版五年级数学上册
- 小学劳动教育实施情况调查问卷(含教师卷和学生卷)及调查结论
- 江西省南昌市雷式学校2024-2025学年八年级上学期第一次月考物理试卷
- 06《诫子书》理解性默写-2022-2023学年七年级语文上册知识梳理与能力训练
- 【幼儿的不良饮食习惯及影响因素探究11000字(论文)】
- 六年级趣味数学思维拓展题50道及答案
- 静脉治疗护理小组职责
- 第六章《发展与合作》课件-2024-2025学年人教版初中地理七年级上册
- 医院感染监测规范
- 风险分级管控和隐患排查治理体系培训考试试题(附答案)
- 项目四任务1:认识毫米波雷达(课件)
评论
0/150
提交评论