第05章TCP应用编程PPT优秀课件

上传人:桔**** 文档编号:567395535 上传时间:2024-07-20 格式:PPT 页数:53 大小:493.50KB
返回 下载 相关 举报
第05章TCP应用编程PPT优秀课件_第1页
第1页 / 共53页
第05章TCP应用编程PPT优秀课件_第2页
第2页 / 共53页
第05章TCP应用编程PPT优秀课件_第3页
第3页 / 共53页
第05章TCP应用编程PPT优秀课件_第4页
第4页 / 共53页
第05章TCP应用编程PPT优秀课件_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《第05章TCP应用编程PPT优秀课件》由会员分享,可在线阅读,更多相关《第05章TCP应用编程PPT优秀课件(53页珍藏版)》请在金锄头文库上搜索。

1、1 1第第5章章 TCPTCP应用用编程程 5.1 TCP应用用编程概述程概述 5.2 利用同步利用同步TCP编写网写网络聊天程序聊天程序 5.3 利用同步利用同步TCP编写网写网络游游戏 5.4 异步异步TCP应用用编程程5.5 异步异步TCP编程程举例例2 2第第5章章 TCPTCP应用用编程(程(续)本章教学目的本章教学目的 通通过学学习,使学生掌握涉及的知,使学生掌握涉及的知识点,能点,能对TCP同步同步编程流程有深入程流程有深入认识,并熟悉异步,并熟悉异步TCP编程的基本概念和异步程的基本概念和异步TCP应用用编程的一般方法。程的一般方法。本章教学要求本章教学要求 (1)掌握)掌握T

2、CP的特点、涉及到相关的特点、涉及到相关类、TCP应用用编程的一般步程的一般步骤以及以及怎怎样解决无消息解决无消息边界界问题 ; (2)掌握同步)掌握同步TCP编程的流程和使用方法。程的流程和使用方法。 (3)掌握异步)掌握异步设计模式、异步模式、异步TCP应用用编程的一般方法。程的一般方法。教学教学难点和重点点和重点 TCP应用用编程的一般步程的一般步骤,如何开辟多,如何开辟多线程与多个客程与多个客户打交道,如何打交道,如何实现服服务器和客器和客户端相关功能。异步端相关功能。异步设计模式模式实现。3 35.1 TCP应用用编程概述程概述 5.1.1 TCP简介介5.1.2 TcpListen

3、er类与与TcpClient类5.1.3 TCP应用用编程的一般步程的一般步骤5.1.4 TCP的无消息的无消息边界界问题4 45.1.1 TCP简介介TCP是是Transmission Control Protocol(传输控制控制协议)的的简称,是称,是TCP/IP体系中体系中面向面向连接接的的运运输层协议,在网,在网络中中提供提供全双工的和可靠的全双工的和可靠的服服务。TCP最主要的特点:最主要的特点: (1)是面向)是面向连接的接的传输层协议; (2)每个)每个TCP连接只能有两个端点,而且只能一接只能有两个端点,而且只能一对一通信,一通信,不能一点不能一点对多点直接通信。多点直接通信

4、。 (3)通)通过TCP连接接传送的数据,能保送的数据,能保证数据无差数据无差错、不、不丢失、失、不重复地准确到达接收方,并且保不重复地准确到达接收方,并且保证各数据到达的各数据到达的顺序与数序与数据据发出的出的顺序相同。序相同。 (4)数据以字)数据以字节流的方式流的方式传输。 (5)传输的数据无消息的数据无消息边界。界。5 55.1.1 TCP简介(介(续)利用利用TCP开开发应用程序用程序时,.NET框架提供两种工作方式框架提供两种工作方式.(1)同步工作方式同步工作方式指利用指利用TCP编写的程序写的程序执行到行到发送、接收或送、接收或监听听语句句时,在未完成工作前不再在未完成工作前不

5、再继续往下往下执行,即行,即处于阻塞状于阻塞状态,直到,直到该语句完成相句完成相应的工作后才的工作后才继续执行下一条行下一条语句;句;(2)异步工作方式异步工作方式异步工作方式是指程序异步工作方式是指程序执行到行到发送、接收或送、接收或监听听语句句时,不不论工作是否完成,都会工作是否完成,都会继续往下往下执行。行。例如:例如:同步接收数据同步接收数据时,接收方,接收方执行到接收行到接收语句后将句后将处于阻于阻塞方式,只有接收到塞方式,只有接收到对方方发来的数据后才来的数据后才继续执行下一条行下一条语句;而如果采用异步工作方式,句;而如果采用异步工作方式,则接收方在接收方在执行到接收行到接收语句

6、句后,无后,无论是否接收到是否接收到对方方发来的数据,程序都来的数据,程序都继续往下往下执行。行。6 65.1.1 TCP简介(介(续)思考:思考:这里的同步里的同步TCP和异步和异步TCP与与线程同步异步是否概程同步异步是否概念是否相同?念是否相同?回答:回答:(1)这里的同步里的同步TCP和异步和异步TCP仅仅指工作方式,它和指工作方式,它和线程程间的同步不是一个概念。的同步不是一个概念。(2)线程程间的同步指不同的同步指不同线程或其共享程或其共享资源具有先后关源具有先后关联的的关系,而同步关系,而同步TCP和异步和异步TCP则仅仅指指TCP编程中采用哪程中采用哪种工作方式,即是从种工作方

7、式,即是从执行到行到发送、接收或送、接收或监听听语句句时,程,程序是否序是否继续往下往下执行行这个角度来个角度来说的。的。7 75.1.2 TcpListener类与与TcpClient类TcpListener类与与TcpClient类两个两个类均封装了底均封装了底层的套接的套接字,并分字,并分别提供了提供了对套接字套接字进一步封装后的同步和异步操一步封装后的同步和异步操作的方法,作的方法,降低了降低了TCP应用用编程的程的难度度。1.TcpListener类用于用于侦听和接受听和接受传入的入的连接接请求。求。 2.TcpClient类用于提供本地主机和用于提供本地主机和远程主机的程主机的连接

8、信息。接信息。注意,注意,TcpListener和和TcpClient只支持只支持标准准协议编程程。如。如果希望果希望编写非写非标准准协议的程序,只能使用套接字来的程序,只能使用套接字来实现。8 85.1.2 TcpListener类与与TcpClient类(续)TcpListener类1.TcpLISTener类在在System.Net.Socket命名空命名空间下。下。2.常用的构造函数有两种:常用的构造函数有两种:TcpListener(IPEndPoint iep)TcpListener(IPAddress localAddr, int port)3.举例:例:IPAddress ip

9、Address = Dns.Resolve(localhost).AddressList0;Try TcpListener tcpListener = new TcpListener(ipAddress, 1326); catch ( Exception e) Console.WriteLine( e.ToString(); 9 95.1.2 TcpListener类与与TcpClient类(续)在同步工作方式下,在同步工作方式下, TcpListener类常用的方法:常用的方法:1.Start启启动监听,构造函数听,构造函数为:public void Start(int backlog)参数

10、参数backlog为请求求队列的最大列的最大长度,即最多允度,即最多允许的的客的的客户端端请求求连接个数;接个数;2.Stop关关闭TcpListener并停止并停止监听听请求求,构造函数,构造函数为:public void Stop();3.AcceptSocket 在同步阻塞方式下在同步阻塞方式下获取并返回一个用来接收和取并返回一个用来接收和发送数据的送数据的Socket对象,象,同同时从从传入的入的连接接队列中移除列中移除该客客户端的端的连接接请求。求。 4.AcceptTcpClient在同步阻塞方式下在同步阻塞方式下获取并返回一个封装了取并返回一个封装了Socket的的TcpClie

11、nt对象,象,同同时从从传入的入的连接接队列中移除列中移除该客客户端的端的连接接请求。求。 10105.1.2 TcpListener类与与TcpClient类(续)TcpClient类1.TcpClient类在在System.Net.Socket命名空命名空间下。下。2.主要用于主要用于编写客写客户端程序,且需要直接端程序,且需要直接利用构造函数利用构造函数创建建TcpClient对象。象。而服而服务器端程序中是通器端程序中是通过TcpListener对象的象的AcceptTcpClient方法得到方法得到TcpClient对象的,所以不需象的,所以不需要使用要使用TcpClient类的构造

12、函数来的构造函数来创建建TcpClient对象。象。 3.构造函数有四种重构造函数有四种重载形式形式TcpClient()TcpClient(AddressFamily family)TcpClient(IPEndPoint iep) TcpClient(string hostname,int port) 11115.1.2 TcpListener类与与TcpClient类(续)(1)TcpClient() 该构造函数构造函数创建一个默建一个默认的的TcpClient对象,并自象,并自动分配分配本机(客本机(客户端)端)IP地址和端口号。利用此构造函数地址和端口号。利用此构造函数创建建对象后,

13、象后,还必必须调用用Connect方法与服方法与服务器建立器建立连接。接。 例如:例如: TcpClient tcpClient=new TcpClient(); tcpClient.Connect(, 51888);12125.1.2 TcpListener类与与TcpClient类(续)(2)TcpClient(AddressFamily family) 该构造函数构造函数创建的建的TcpClient对象也能自象也能自动分配本机(客分配本机(客户端)端)IP地址和端口号,但是使用地址和端口号,但是使用AddressFamily枚枚举指指定使用哪种网定使用哪种网络协议。创建建该对象后,必象后

14、,必须调用用Connect方法与服方法与服务器建立器建立连接。接。 例如:例如: TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork); tcpClient.Connect(, 51888);13135.1.2 TcpListener类与与TcpClient类(续)(3)TcpClient(IPEndPoint iep) 该构造函数的参数构造函数的参数iep指定本机(客指定本机(客户端)端)IP地址与端口地址与端口号。当客号。当客户端有一个以上的端有一个以上的IP地址地址时,而且程序,而且程序员希望直希望直接指定使用的接

15、指定使用的IP地址和端口号,可以使用地址和端口号,可以使用这种方式。如果种方式。如果使用使用这种方式,必种方式,必须调用用Connect方法与服方法与服务器建立器建立连接。接。例如:例如: IPAddress address = Dns.GetHostAddresses(Dns.GetHostName(); IPEndPoint iep = new IPEndPoint(address0, 51888); TcpClient tcpClient = new TcpClient(iep); tcpClient.Connect(, 51888);14145.1.2 TcpListener类与与Tc

16、pClient类(续)(4)TcpClient(string hostname,int port) 这是使用最方便的一种构造函数。参数中的是使用最方便的一种构造函数。参数中的hostname表表示要示要连接到的接到的远程主机的程主机的DNS名,名,port表示要表示要连接到的接到的远程主机的端口号。程主机的端口号。该构造函数会自构造函数会自动分配最合适的本地主分配最合适的本地主机机IP地址和端口号,并地址和端口号,并对DNS进行解析,然后与行解析,然后与远程主机程主机建立建立连接。例如:接。例如: TcpClient tcpClient = new TcpClient(, 51888); 它相

17、当于:它相当于: TcpClient tcpClient = new TcpClient(); tcpClient Connect(,51888); 15155.1.2 TcpListener类与与TcpClient类(续)TcpClient类的常用属性类的常用属性属性含义Client获取或设置基础套接字LingerState获取或设置有关套接字逗留时间的时间NoDelay获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟(true禁用延迟,默认false) ReceiveBufferSize获取或设置接收缓冲区的大小(默认8192字节)ReceiveTimeout获取或设置套接字接收数据

18、的超时时间(毫秒)SendBufferSize获取或设置发送缓冲区的大小(默认8192字节)SendTimeout获取或设置套接字发送数据的超时时间(毫秒)16165.1.2 TcpListener类与与TcpClient类(续)TcpClient类的常用方法类的常用方法属性含义Close释放TcpClient实例,而不关闭基础连接Connect 用指定的主机名和端口号将客户端连接到TCP主机 BeginConnect 开始一个对远程主机连接的异步请求 EndConnect 异步接受传入的连接尝试 GetStream 获取能够发送和接收数据的NetworkStream对象 17175.1.2

19、TcpListener类与与TcpClient类(续)TcpClient用法用法举例:例:TcpClient tcpClient = new TcpClient();tcpClient.Connect(contosoServer, 11000);NetworkStream networkStream = tcpClient.GetStream();networkStream.ReadTimeout = 10;byte bytes = new byte1024;networkStream.Read(bytes, 0, 1024);string data = Encoding.UTF8.GetSt

20、ring(bytes); networkStream.Close();tcpClient.Close(); 18185.1.3 TCP应用用编程的一般步程的一般步骤不不论是是多多么么复复杂的的TCP应用用程程序序,网网络通通信信的的最最基基本本前前提提就就是是客客户端端要要先先和和服服务器器建建立立TCP连接接,然然后后才才可可以以在在此此基基础上上相相互互传输数数据据。由于服由于服务器需要同器需要同时为多个客多个客户端服端服务,因此程序相,因此程序相对复复杂一些。一些。在在服服务器器端端,程程序序员需需要要编写写程程序序不不断断地地监听听客客户端端是是否否有有连接接请求求,一一旦旦接接受受了

21、了客客户端端连接接请求求,即即能能识别是是哪哪个个客客户;而而客客户端端与与服服务器器连接接则相相对比比较简单,只只需需要要指指定定连接接哪哪个个服服务器器即即可可。一一旦旦双双方方建建立立了了连接接并并创建建了了对应的的套套接接字字,就就可可以以相相互互传输数数据据了了。在在程程序序中,中,发送和接收数据的方法都是一送和接收数据的方法都是一样的,区的,区别仅是方向不同。是方向不同。19195.1.3 TCP应用用编程的一般步程的一般步骤(续)编写写服服务器端器端程序的一般步程序的一般步骤为: 使用使用对套接字封装后的套接字封装后的类,编写基于写基于TCP的服的服务器端程序的器端程序的一般步一

22、般步骤为:(1)创建一个建一个TcpListener对象,然后象,然后调用用该对象的象的Start方方法在指定的端口法在指定的端口进行行监听。听。(2)在)在单独的独的线程中,循程中,循环调用用AcceptTcpClient方法接受方法接受客客户端的端的连接接请求,并根据求,并根据该方法的返回的方法的返回的结果得到与果得到与该客客户端端对应的的TcpClient对象。象。(3)每得到一个新的)每得到一个新的TcpClient对象,就象,就创建一个与建一个与该客客户对应的的线程,在程,在线程中与程中与对应的客的客户进行通信。行通信。(4)根据)根据传送信息的情况确定是否关送信息的情况确定是否关闭

23、与客与客户的的连接。接。 20205.1.3 TCP应用用编程的一般步程的一般步骤(续)编写写客客户端端程序的一般步程序的一般步骤为:使用使用对套接字封装后的套接字封装后的类,编写基于写基于TCP的客的客户端程序的一端程序的一般步般步骤如下:如下:(1)利用)利用TcpClient的构造函数的构造函数创建一个建一个TcpClient对象。象。(2)使用)使用Connect方法与服方法与服务器建立器建立连接。接。(3)利用)利用TcpClient对象的象的GetStream方法得到网方法得到网络流,然流,然后利用后利用该网网络流与服流与服务器器进行数据行数据传输。(4)创建一个建一个线程程监听指

24、定的端口,循听指定的端口,循环接收并接收并处理服理服务器器发送送过来的信息。来的信息。(5)完成工作后,向服)完成工作后,向服务器器发送关送关闭信息,并关信息,并关闭与服与服务器器的的连接。接。 21215.1.4 TCP的无消息的无消息边界界问题在网在网络传输中,可能会出中,可能会出现发送方一次送方一次发送的消息与接收方一送的消息与接收方一次接收的消息不一致的次接收的消息不一致的现象。象。这主要是因主要是因为TCP协议是字是字节流流形式的、无消息形式的、无消息边界的界的协议,由于受网,由于受网络传输中的不确定因素中的不确定因素的影响,因此不能保的影响,因此不能保证单个个Send方法方法发送的

25、数据被送的数据被单个个Receive方法方法读取。取。实际应用中,解决用中,解决TCP协议消息消息边界界问题的方法有三种:的方法有三种:1.发送固定送固定长度的消息,度的消息,该方法适用于消息方法适用于消息长度固定的度固定的场合。合。2.将消息将消息长度与消息一起度与消息一起发送,送,这种方法适用于任何种方法适用于任何场合。合。3.使用特殊使用特殊标记分隔消息,分隔消息,这种方法主要用于消息中不包含种方法主要用于消息中不包含特殊特殊标记的的场合。合。22225.2 利用同步利用同步TCP编写网写网络聊天程序聊天程序【例例5-1】利用同步利用同步TCP和和BinaryReader及及Binary

26、Writer对象象编写一写一个个简单的网的网络聊天程序。功能要求:聊天程序。功能要求:(1)任何一个客)任何一个客户端,均可以与服端,均可以与服务器器进行通信。行通信。(2)服)服务器要能器要能显示客示客户端端连接的状接的状态,当客,当客户端端连接成功后,接成功后,要自要自动及及时告知客告知客户端已端已经连接成功的信息,并将当前在接成功的信息,并将当前在线的的所有客所有客户告知告知该客客户端。端。 (3)客)客户和服和服务器建立器建立连接后,即可以通接后,即可以通过服服务器和任一个在器和任一个在线的其他客的其他客户聊天。聊天。 (4)不)不论客客户何何时退出程序,服退出程序,服务器都要做出正确

27、判断,同器都要做出正确判断,同时将将该客客户是否在是否在线的情况告的情况告诉其他所有在其他所有在线的客的客户。 23235.2 利用同步利用同步TCP编写网写网络聊天程序(聊天程序(续)服服务器端器端设计界面界面图5-1 服务器设计界面24245.2 利用同步利用同步TCP编写网写网络聊天程序(聊天程序(续)客客户端端设计界面界面图5-2 聊天客户端设计界面25255.2 利用同步利用同步TCP编写网写网络聊天程序(聊天程序(续)运行效果运行效果图5-3 例5-1的运行效果26265.3 利用同步利用同步TCP编写网写网络游游戏【例例5-2】编写一个可以通写一个可以通过因特网因特网对弈的弈的“

28、吃棋子吃棋子”游游戏。功能要求:功能要求:1) 服服务器可以同器可以同时服服务多桌,每桌允多桌,每桌允许两个玩家通两个玩家通过因特网因特网对弈。弈。2) 允允许玩家自由玩家自由选择坐在哪一桌的哪一方。如果两个玩家坐在同一桌,坐在哪一桌的哪一方。如果两个玩家坐在同一桌,双方双方应都能看到都能看到对方的状方的状态。两个玩家均。两个玩家均单击“开始开始”按按钮,游,游戏就开始了。就开始了。3) 某桌游某桌游戏开始后,服开始后,服务器以固定的器以固定的时间间隔同隔同时在在1515的棋的棋盘方方格内向格内向该桌随机地桌随机地发送黑白两种送黑白两种颜色的棋子位置,客色的棋子位置,客户端程序接收端程序接收到

29、服到服务器器发送的棋子位置和送的棋子位置和颜色后,在色后,在1515棋棋盘的相的相应位置位置显示示棋子。棋子。4) 玩家坐到游玩家坐到游戏桌座位上后,不桌座位上后,不论游游戏是否开始,是否开始,该玩家都可以随玩家都可以随时调整服整服务器器发送棋子的送棋子的时间间隔。隔。27275.3 利用同步利用同步TCP编写网写网络游游戏(续)5) 游游戏开始后,客开始后,客户端程序响端程序响应鼠鼠标单击。每当玩家。每当玩家单击了某个棋了某个棋子,子,该棋子就会从棋棋子就会从棋盘上消失,同上消失,同时具有相具有相应颜色的玩家得色的玩家得1分。分。注意,如果玩家注意,如果玩家单击了了对方方颜色的棋子,色的棋子

30、,则对方得方得1分。分。6) 如果两个相同如果两个相同颜色的棋子在水平方向或垂直方向是相色的棋子在水平方向或垂直方向是相邻的,那么的,那么就就认为这两个棋子是相两个棋子是相邻的。的。这里不考里不考虑对角角线相相邻的情况。如的情况。如果相同果相同颜色的棋子出色的棋子出现在相在相邻的位置,游的位置,游戏就就结束了。束了。该颜色色对应的玩家就是失的玩家就是失败者。者。7) 同一桌的两个玩家可以聊天。同一桌的两个玩家可以聊天。 这个游个游戏虽然比然比较简单,但却是,但却是“麻雀麻雀虽小、五小、五脏俱全俱全”。如果。如果读者真正理解了者真正理解了编写的方法,就可以写的方法,就可以轻松松编写各写各类基于基

31、于C/S模式模式的因特网的因特网应用程序。用程序。 28285.3 利用同步利用同步TCP编写网写网络游游戏(续)服服务器端器端编程程1.服服务器启器启动服服务后,需要后,需要创建一个建一个线程程专门用于用于监听玩家听玩家的的连接接请求。在求。在监听听线程中,服程中,服务器一旦接受一个器一旦接受一个连接,接,就就创建一个与建一个与该玩家玩家对应的的线程,用于接收程,用于接收该玩家玩家发送的送的信息,并根据信息,并根据该玩家玩家发送的信息提供相送的信息提供相应的服的服务。2.有多少个玩家有多少个玩家连接,就接,就创建多少个建多少个对应的的线程。玩家退出程。玩家退出游游戏室,其室,其对应的的线程自

32、程自动终止。服止。服务器可以限制器可以限制进入游入游戏室的玩家数量,具体可以同室的玩家数量,具体可以同时进入多少玩家,可以根据入多少玩家,可以根据服服务器内存容量以及服器内存容量以及服务器运行速度决定。器运行速度决定。 3.在与每个玩家在与每个玩家对应的的线程中,服程中,服务器收到器收到对应玩家玩家发送的送的字符串信息后,需要解析字符串的含字符串信息后,需要解析字符串的含义,并决定服,并决定服务器需器需要的操作。要的操作。29295.3 利用同步利用同步TCP编写网写网络游游戏(续)服服务器端器端设计界面界面图5-4 服务器设计界面30305.3 利用同步利用同步TCP编写网写网络游游戏(续)

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

34、5 棋盘棋子与设计界界面32325.3 利用同步利用同步TCP编写网写网络游游戏(续)客客户端端设计界面(界面(2)图5-6 客户端FormPlaying.cs的设计界面33335.4 异步异步TCP应用用编程程5.4.1 异步异步设计模式概述模式概述5.4.2 异步异步TCP应用用编程的一般方法程的一般方法5.4.3 使用异步方式使用异步方式调用同步方法用同步方法34345.4.1 异步异步编程模式概述程模式概述什么是异步什么是异步编程程1.异步操作方式:异步操作方式:某个工作开始以后,能在某个工作开始以后,能在这个工作尚未完成的个工作尚未完成的时候候继续处理其他工作。异步操作一般在理其他工

35、作。异步操作一般在单独的独的线程中程中执行,行,调用用异步方法异步异步方法异步执行某个操作行某个操作时,可同,可同时继续执行行该异步方法后面异步方法后面的代的代码。2.异步异步编程:程:使用异步操作方式使用异步操作方式编写程序。异步写程序。异步编程用于异步操作程用于异步操作执行完成行完成时间可能可能较长的任的任务,如打开大文件、,如打开大文件、连接接远程程计算机算机或或查询数据数据库等等.异步异步编程的两种程的两种设计模式:模式:1.基于事件的异步基于事件的异步设计模式:模式:简化异步化异步编程复程复杂度,适用一般程序度,适用一般程序员2.基于基于IAsyncResult的异步的异步设计模式:

36、功能全,适用有模式:功能全,适用有经验的程序的程序员 35355.4.1 异步异步编程模式概述(程模式概述(续)1.基于事件的异步基于事件的异步设计模式模式1.该模式用事件模式用事件驱动模型模型实现异步方法。异步方法。2.这种模式用种模式用单独的独的线程在后台程在后台执行耗行耗时的任的任务,当后台任,当后台任务完成完成时,就自,就自动触触发对应的事件。的事件。3.优点:点:该模式既具有多模式既具有多线程程应用程序的用程序的优点,同点,同时也也隐匿匿了多了多线程程设计中固有的中固有的许多复多复杂问题。4.例如:例如:BackgroundWorker组件件 ,PictureBox控件控件 3636

37、5.4.1 异步异步编程模式概述(程模式概述(续)在在.NET中,提供异步中,提供异步处理功能的有:理功能的有: 1.文件文件 I/O、流、流 I/O、套接字、套接字 I/O。2.网网络。3.远程程处理信道(理信道(HTTP、TCP)和代理。)和代理。4.使用使用 ASP.NET 创建的建的 XML Web services。5.ASP.NET Web 窗体。窗体。6.使用使用 MessageQueue 类的消息的消息队列。列。7.BackgroundWorker等等组件件 37375.4.1 异步异步编程模式概述(程模式概述(续)基于事件的异步基于事件的异步设计模式的特点模式的特点(例子(例

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

39、作完成时都会接到通知。都会接到通知。5.后台等待后台等待资源源时,不会停止(,不会停止(“挂起挂起”)应用程序。用程序。6.使用熟悉的事件和委托模型与挂起的异步操作通信。使用熟悉的事件和委托模型与挂起的异步操作通信。7.支持基于事件的异步模式的支持基于事件的异步模式的类一般都有一个或多个后一般都有一个或多个后缀为 “Async” 的方法。的方法。该类还可能有一个后可能有一个后缀为“Completed”的事件,以及后的事件,以及后缀为“AsyncCancel”(或只有(或只有 CancelAsync)的方法。)的方法。38385.4.1 异步异步编程模式概述(程模式概述(续)支持基于事件的异步支

40、持基于事件的异步设计模型的模型的组件或控件件或控件举例例1.PictureBox控件:提供了异步的控件:提供了异步的LoadAsync 方法,比如方法,比如异步下异步下载图像,程序像,程序调用用LoadAsync方法方法时,会,会继续执行行该语句后面的句后面的语句,而下句,而下载操作将在另一个操作将在另一个线程上(后程上(后台)台)进行。下行。下载完成完成时,线程会自程会自动触触发LoadCompleted事件。基于事件的异步模式要求异步操事件。基于事件的异步模式要求异步操作可以取消,作可以取消,PictureBox提供的与之提供的与之对应的方法名的方法名为CancelAsync。2.Back

41、groundWork组件:能完成件:能完成绝大多数异步大多数异步编程功能。程功能。建建议尽量使用它尽量使用它实现异步操作。异步操作。3.除了除了这两个以外,其他很多两个以外,其他很多组件或控件也支持异步操作。件或控件也支持异步操作。例如例如SoundPlayer组件、件、WebClient类等等39395.4.1 异步异步编程模式概述(程模式概述(续)基于基于IAsyncResult的异步的异步设计模式模式1.通通过前前缀分分别为“Begin”和和“End”的两个方法的两个方法实现开始和开始和结束异步束异步操作,例如操作,例如FileStream类提供提供BeginRead和和EndRead方

42、法来从文件方法来从文件异步异步读取字取字节。程序在。程序在调用用Begin后,可以在后,可以在调用用线程上程上继续执行行其下面的指令,同其下面的指令,同时异步操作在另一个异步操作在另一个线程上程上执行。行。2.Begin方法开始异步操作,并返回一个方法开始异步操作,并返回一个实现 IAsyncResult接口的接口的对象。象。IAsyncResult对象存象存储有关异步操作的状有关异步操作的状态信息。信息。这些信息包括:些信息包括:IAsyncState:可:可选的特定的的特定的对象,包含异步操作需要的信息。象,包含异步操作需要的信息。AsyncWaitHandle:用于在异步操作完成前阻止程

43、序:用于在异步操作完成前阻止程序执行。行。CompletedSynchronously:指示异步操作是否在用于:指示异步操作是否在用于调用用Begin的的线程上完成,而不是在程上完成,而不是在单独的独的ThreadPool线程上完成。程上完成。IsCompleted:一个布:一个布尔值,指示异步操作是否已完成。,指示异步操作是否已完成。特点特点1.适用面广、灵活性高、但学适用面广、灵活性高、但学习起来比事件起来比事件设计模式复模式复杂。2.每次每次调用用Begin后,程序后,程序还应调用用End来来获取操作的取操作的结果。果。40405.4.1 异步异步编程模式概述(程模式概述(续) (1 1

44、)BeginBegin方法和方法和endend方法成对出现:程序调用异步操作方法成对出现:程序调用异步操作的的BeginBegin方法时,系统会自动在线程池中创建对应的线程进行异方法时,系统会自动在线程池中创建对应的线程进行异步操作,从而保证调用方和被调用方同时执行。步操作,从而保证调用方和被调用方同时执行。(2 2)当线程池中的)当线程池中的BeginBegin方法执行完毕时,会自动通过方法执行完毕时,会自动通过AsyncCallbackAsyncCallback委托调用在委托调用在BeginBegin方法的参数中指定方法的参数中指定的回调方的回调方法法。41415.4.1 异步异步编程模式

45、概述(程模式概述(续)如何理解异步设计模式(对比举例)如何理解异步设计模式(对比举例)实际工作实际工作程序实现程序实现主管人员安主管人员安排排A负责处理客负责处理客人来访时办理一系列登记手人来访时办理一系列登记手续续程序员编写程序让子线程程序员编写程序让子线程A负责处理客人来负责处理客人来访时办理一系列登记手续访时办理一系列登记手续没有人来访时,没有人来访时,A可以到别可以到别处继续做其他事,并约定有处继续做其他事,并约定有人来访时,总控室通过电话人来访时,总控室通过电话通知通知A子线程执行启动监听的语句(子线程执行启动监听的语句(Begin)后,后,继续执行其下面的语句完成其他功能,同继续执

46、行其下面的语句完成其他功能,同时声明让系统利用时声明让系统利用Asynccallback委托执委托执行行(End)方法调用自定义的方法方法调用自定义的方法F一旦有客人来访,总控室就一旦有客人来访,总控室就会立即给会立即给A打电话打电话 一旦有客户端请求,系统就会自动执行与一旦有客户端请求,系统就会自动执行与Begin对应的对应的End方法调用方法方法调用方法FA接到通知后,在转去处理接到通知后,在转去处理客人来访时需要的登记手续客人来访时需要的登记手续 在自定义的方法在自定义的方法F中编写程序完成有客户端中编写程序完成有客户端请求时需要处理的工作请求时需要处理的工作42425.4.2 异步异步

47、TCP应用用编程的一般方法程的一般方法使用异步使用异步TCP编程时,除了套接字有对应的异步操作方式外,编程时,除了套接字有对应的异步操作方式外,TcpListener和和TcpClient类均提供了返回结果为类均提供了返回结果为IasyncResult类型的异步操作的方法。类型的异步操作的方法。见下页表。见下页表。类提供的方法说 明TcpListenerBeginAcceptTcpClient开始一个异步操作接受一个传入的连接尝试EndAcceptTcpClient异步接受传入的连接尝试,并创建新的TcpClient处理远程主机通信TcpClientBeginConnect开始一个对远程主机连

48、接的异步请求EndConnect异步接受传入的连接尝试SocketBeginReceive开始从连接的Socket中异步接收数据EndReceive结束挂起的异步读取BeginSend将数据异步发送到连接的SocketEndSend结束挂起的异步发送43435.4.2 异步异步TCP应用用编程的一般方法程的一般方法1BeginAcceptTcpClient方法和EndAcceptTcpClient方法 BeginAcceptTcpClient:程序执行BeginAcceptTcpClient方法后,会立即在线程池中自动创建一个线程,同时在该线程中监听客户端连接请求。一旦接受了客户端连接请求,就

49、通过委托执行相应的方法,并返回状态信息。 public IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, Object state)参数1:AsyncCallback类型的委托, 参数2:Object类型,用于将状态信息传递给委托调用的方法。回调方法名回调方法名44445.4.2 异步异步TCP应用用编程的一般方法程的一般方法1BeginAcceptTcpClient方法和方法和EndAcceptTcpClient方法方法回调方法中传递的参数只有一个,而且必须是IAsyncResult类型的接口,它表示异步操作的状态,如果有多个

50、状态需要传递,可以将其事先封装到某个类中 AsyncCallback callback = new AsyncCallback(AcceptClient); tcpListener.BeginAcceptTcpClient(callback, tcpListener); .void AcceptClient( IAsyncResult ar) TcpListener myListener = (TcpListener)ar.AsyncState; TcpClient client = myListener.EndAcceptTcpClient(ar); 45455.4.2 异步异步TCP应用用

51、编程的一般方法程的一般方法2BeginConnect方法和方法和EndConnect方法方法 在在BeginConnect方法操作完成前,方法操作完成前,调用用该方法的方法的线程不会程不会阻塞,系阻塞,系统会自会自动用独立的用独立的线程来程来执行行该方法,直到与方法,直到与远程主机程主机连接成功或抛出异常。接成功或抛出异常。 public IAsyncResult BeginConnect(IPAddress address, int port, AsyncCallback requestCallback, Object state); 参数:address为远程主机的IPAddress对象;

52、 port为远程主机的端口号; requestCallback为AsyncCallback类型的委托; state为包含连接操作的相关信息,当操作完成时,此对象会被传递给requestCallback委托。46465.4.2 异步异步TCP应用用编程的一般方法程的一般方法2BeginConnect方法和方法和EndConnect方法方法AsyncCallback requestCallback = new AsyncCallback(FinishConnect);tcpClient.BeginConnect(远程主机程主机IP或域名或域名,远程主机端口号程主机端口号, requestCallb

53、ack, tcpClient);void FinishConnect (IAsyncResult ar) tcpClient = (TcpClient)ar.AsyncState; client.EndConnect(ar); 在自定在自定义的的FinishConnect方法中,通方法中,通过获取的状取的状态信息得到新的信息得到新的TcpClient类型的型的对象,并象,并调用用EndConnect完成完成连接接请求。求。同步参数委托Object参数47475.4.2 异步异步TCP应用用编程的一般方法程的一般方法3异步发送和接收数据public override IAsyncResult B

54、eginWrite(byte buffer, int offset, int size, AsyncCallback callback, Object state);public override IAsyncResult BeginRead(byte buffer, int offset, int size, AsyncCallback callback, Object state);(1)buffer为字节数组,表示用来存放要发送的数据,从NetworkStream读取的数据;(2)offset用来存放发送或读取的数据在缓冲区中的起始位置; (3)size用来存放发送或接收数据的字节数;(

55、4)callback是异步回调类型的委托(5)state包含状态信息。48485.4.3 使用异步方式使用异步方式调用同步方法用同步方法1声明与要声明与要调用的方法具有相同用的方法具有相同签名的委托名的委托private BinaryReader br;delegate void SendMessageDelegate(string message);private void SendMessage(string message) try bw.Write(message); bw.Flush( ); catch MessageBox.Show (发送失送失败!); 49495.4.3 使用异

56、步方式使用异步方式调用同步方法用同步方法2通通过轮询方式方式检查异步异步调用是否完成用是否完成private bool needExit;SendMessageDelegate d = new SendMessageDelegate(SendMessage);IAsyncResult result = d.BeginInvoke(message, null, null);while (result.IsCompleted = false) if (needExit) break; Thread.Sleep(50);50505.4.3 使用异步方式使用异步方式调用同步方法用同步方法3使用使用En

57、dInvoke结束异步束异步调用用EndInvoke方法用于检索异步调用的结果,并结束异步调用。调用BeginInvoke之后,随时可以调用该方法。如果异步调用尚未完成,则EndInvoke会一直阻止调用线程,直到异步调用完成。例如:在退出轮询后,可以直接通过下面的代码结束异步调用:d.EndInvoke(result);注意:一般不要从服务于用户界面的线程直接调用EndInvoke方法,否则会在异步操作完成前,给用户一个界面无反应的错觉。P147页51515.5 利用异步利用异步TCP编写网写网络聊天程序聊天程序【例例5-3】利用基于利用基于IAsyncResult的异步的异步设计模式,模式,实现与例与例5-1相同的功能。相同的功能。设计界面:界面:(运行效果(运行效果见下下页)52525.5 利用异步利用异步TCP编写网写网络聊天程序(聊天程序(续)运行效果运行效果图5-11 异步TCP聊天服务器端和客户端部分运行效果5353本章作本章作业及及实验作作业:1、2、3、4、5、6 实验:做:做实验二:即二:即时通通讯系系统 (具体要求(具体要求见实验指指导书)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号