




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TCP协议的编程与开发技术,3.1套接字与TCP协议,3.1.1使用套接字传输数据3.1.2NetworkStream对象与数据的发送与接收3.1.3TCPClient与TCPListener类3.1.4使用TCP-IP协议编写通信代码,2,PPT学习交流,3.1.1使用套接字传输数据P58,服务器端的工作原理,ClientService类的结构,3,PPT学习交流,3.1.2NetworkStream对象,TCP数据是以连续数据流的形式传输的,NetworkStream专门用于通过套接字发送与接收数据。NetworkStream类提供在阻止模式下通过Stream套接字发送和接收数据的方法。可以在同步和异步数据传输时使用NetworkStream类。若要创建NetworkStream,必须提供连接的Socket。将Write和Read方法用于简单的单线程同步阻止I/O。若要使用不同的线程来处理I/O,则请考虑使用BeginWrite和EndWrite方法,或BeginRead和EndRead方法进行通信。NetworkStream不支持对网络数据流的随机访问。CanSeek属性用于指示流是否支持查找,它的值始终为false;读取Position属性、读取Length属性或者调用Seek方法都会引发NotSupportedException。,4,PPT学习交流,3.1.2NetworkStream对象,5,PPT学习交流,NetworkStream的常用方法,6,PPT学习交流,3.1.3TCPClient与TCPListener类,TCPClient(可以比Socket更方便地构造客户端程序)的构造函数名称说明TcpClient()初始化TcpClient类的新实例。由.NETCompactFramework支持。TcpClient(AddressFamily)使用指定的族初始化TcpClient类的新实例。由.NETCompactFramework支持。TcpClient(IPEndPoint)初始化TcpClient类的新实例,并将其绑定到指定的本地终结点。由.NETCompactFramework支持。TcpClient(String,Int32)初始化TcpClient类的新实例并连接到指定主机上的指定端口。由.NETCompactFramework支持。,7,PPT学习交流,TCPListener,可以提供方便的方式构造TCP的服务器端构造函数:TcpListener(intport)TcpListener(IPEndPointipe)TcpListener(IPAddressaddr,intport),8,PPT学习交流,TCPListener的主要方法请看P65P60,9,PPT学习交流,C#中的委托详解,委托和事件,委托和事件在.NetFramework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得混身不自在。,11,PPT学习交流,通过两个范例由浅入深地讲述:什么是委托、为什么要使用委托。委托、事件的由来、.NetFramework中的委托和事件委托和事件对Observer设计模式的意义,12,PPT学习交流,其实质是-将方法作为方法的参数,先看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语:publicvoidGreetPeople(stringname)/做某些额外的事情,比如初始化之类,此处略EnglishGreeting(name);publicvoidEnglishGreeting(stringname)Console.WriteLine(Morning,+name);GreetPeople用于向某人问好,当传递姓名,比如说“Jimmy”,进去的时候,将调用EnglishGreeting方法,再把name参数传给EnglishGreeting(name);EnglishGreeting则用于向屏幕输出:“Morning,Jimmy”。,13,PPT学习交流,现在假设这个程序需要进行全球化。,如果面对中国人,不明白“Morning”是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法:publicvoidChineseGreeting(stringname)Console.WriteLine(早上好,+name);如何判断到底用哪个版本的Greeting问候方法合适呢?最好再定义一个枚举作为判断的依据:publicenumLanguageEnglish,Chinese,14,PPT学习交流,GreetPeople进行相应的修改,publicvoidGreetPeople(stringname,Languagelang)/做某些额外的事情,比如初始化之类,此处略swith(lang)caseLanguage.English:EnglishGreeting(name);break;caseLanguage.Chinese:ChineseGreeting(name);break;,15,PPT学习交流,但是:此方案的可扩展性很差,OK,尽管这样解决了问题,但这个解决方案的可扩展性很差,如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和GreetPeople()方法,以适应新的需求。在考虑新的解决方案之前,我们先看看GreetPeople的方法签名:publicvoidGreetPeople(stringname,Languagelang),16,PPT学习交流,publicvoidGreetPeople(stringname,Languagelang)我们仅看stringname,在这里,string是参数类型,name是参数变量,当我们赋给name字符串“jimmy”时,它就代表“jimmy”这个值;当我们赋给它“张子阳”时,它又代表着“张子阳”这个值。再仔细想想,假如GreetPeople()方法可以接受一个参数变量,这个变量可以代表另一个方法,当我们给这个变量赋值EnglishGreeting的时候,它代表着EnglsihGreeting()这个方法;当我们给它赋值ChineseGreeting的时候,它又代表着ChineseGreeting()方法。我们将这个参数变量命名为MakeGreeting,那么不是可以如同给name赋值时一样,在调用GreetPeople()方法的时候,给这个MakeGreeting参数也赋上值么(ChineseGreeting或者EnglsihGreeting等)?然后,我们在方法体内,也可以像使用别的参数一样使用MakeGreeting。但是,由于MakeGreeting代表着一个方法,它的使用方式应该和它被赋的方法(比如ChineseGreeting)是一样的,比如:,17,PPT学习交流,适应性改造,好了,有了思路了,我们现在就来改改GreetPeople()方法,那么它应该是这个样子了:publicvoidGreetPeople(stringname,*MakeGreeting)MakeGreeting(name);这个*是什么类型呢?,18,PPT学习交流,本例中委托的定义:publicdelegatevoidGreetingDelegate(stringname);可以与上面EnglishGreeting()方法的签名对比一下,除了加入了delegate关键字以外,其余的是不是完全一样?现在,让我们再次改动GreetPeople()方法,如下所示:publicvoidGreetPeople(stringname,GreetingDelegateMakeGreeting)MakeGreeting(name);,19,PPT学习交流,20,PPT学习交流,总结:,委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。,21,PPT学习交流,一个更好的委托的例子,上面的例子显然能完成我们之前描述的工作,但是却并不够好。现在假设热水器由三部分组成:热水器仅仅负责烧水,它不能发出警报也不能显示水温;警报器发出警报显示器提示和水温,22,PPT学习交流,先用代码完成最基本的功能,/热水器publicclassHeaterprivateinttemperature;/烧水privatevoidBoilWater()for(inti=0;i=100;i+)temperature=i;,23,PPT学习交流,/警报器publicclassAlarmprivatevoidMakeAlert(intparam)Console.WriteLine(Alarm:嘀嘀嘀,水已经0度了:,param);,24,PPT学习交流,/显示器publicclassDisplayprivatevoidShowMsg(intparam)Console.WriteLine(Display:水已烧开,当前温度:0度。,param);,25,PPT学习交流,类之间的协调如何解决,这里就出现了一个问题:如何在水烧开的时候通知报警器和显示器?在继续进行之前,需要先了解一下Observer设计模式,Observer设计模式中主要包括如下两类对象:,26,PPT学习交流,Observer设计模式,Subject:被监视对象,它往往包含着其他对象所感兴趣的内容。在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象。Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动。在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水温。,27,PPT学习交流,在本例中,事情发生的顺序应该是这样的:,1.警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。2.热水器知道后保留对警报器和显示器的引用。3.热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器的MakeAlert()方法、显示器的ShowMsg()方法。,28,PPT学习交流,Observer设计模式,类似这样的例子是很多的,称为Observer设计模式:Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。请看例2,29,PPT学习交流,3.2开发异步的TCP编程,3.2.1TCP异步通信流程3.2.2线程阻塞与异步中的同步问题=同步编程的好处易于理解与实现通信量小的时候更有效率但是经常会进入阻塞状态(给个例子),30,PPT学习交流,几个重要的概念-异步,大家先想一下在饭店点菜的过程异步操作通常用于执行完成时间可能较长的任务,如打开大文件、连接远程计算机或查询数据库。异步操作在主应用程序线程以外的线程中执行。.NETFramework为异步操作提供两种设计模式:使用IAsyncResult对象的异步操作。使用事件的异步操作。IAsyncResult设计模式允许多种编程模型,但更加复杂不易学习,可提供大多数应用程序都不要求的灵活性。,31,PPT学习交流,几个重要的概念-异步,基于事件的异步模式具有多线程应用程序的优点,同时隐匿了多线程设计中固有的许多复杂问题。使用支持此模式的类,您将能够:“在后台”执行耗时任务(例如下载和数据库操作),但不会中断您的应用程序。同时执行多个操作,每个操作完成时都会接到通知。等待资源变得可用,但不会停止(“挂起”)您的应用程序。,32,PPT学习交流,几个重要的概念-异步,支持异步模式的类有一个或多个名为MethodNameAsync的方法。还可能有一个MethodNameCompleted事件,或者会有一个MethodNameAsyncCancel(或只是CancelAsync)方法。,33,PPT学习交流,几个重要的概念-异步,异步调用的一般模式:异步回调函数是基于windows操作系统的事件处理机制.用户先把要处理的事件向操作系统进行注册.操作系统负责把程序的控制传向所委托的方法.不同的事件对应不同的回调函数.请研究表3-6:,34,PPT学习交流,几个重要的概念-异步,异步类的定义例子:这里虚构的AsyncExample类有两个方法,都支持同步和异步调用。,35,PPT学习交流,几个重要的概念-异步,异步方法重载异步操作可以有两个重载:单调用和多调用。您可以通过方法签名来区分这两种形式:多调用形式有一个额外的参数,即userState。使用这种形式,您的代码可以多次调用Method1Async(stringparam,objectuserState),而不必等待任何挂起的异步操作的完成。另一方面,如果您尝试在前一个调用尚未完成时调用Method1Async(stringparam),该方法将引发InvalidOperationException。多调用重载的userState参数可帮助您区分各个异步操作。您应分别为各个Method1Async(stringparam,objectuserState)调用提供一个唯一值(例如GUID或哈希代码);这样,当各个操作完成时,您的事件处理程序便可以确定哪个操作的实例引发了完成事件。在为您对多调用重载的调用中的userState提供唯一值时,一定要小心。如果任务ID不唯一,将导致异步类引发ArgumentException。,36,PPT学习交流,预备知识:需要有基本的Windows编程基础,能够使用现有的Windows控件触发事件编程。,几个重要的概念-委托,37,PPT学习交流,委托Delegate(1),想象成C+中的函数指针,但不同点在与delegate完全面向对象的既封装方法又封装对象实例定义一个委托实际上是定义一个类型的委托,不是一个具体的实例。委托类型指定它代表的方法的返回类型和参数表它代表具有相同参数列表和返回类型的任何方法。,38,PPT学习交流,委托Delegate(2),委托的声明方式和方法的声明类似,包括的是delegate关键字声明中必须包括委托所表示的方法的返回类型和参数列表,delegate(argument_list),例:publicdelegateboolProcessAnything(doubled),创建委托实例new关键字例:ProcessAnythingpa=newProcessAnything(account.Withdraw);括号里面是实例方法,此方法必须和代理声明时的返回类型和参数列表相同。,39,PPT学习交流,委托Delegate(3),委托的调用时通过输入委托实例的名称和要传递委托所表示的方法的参数。委托分为:1、一般委托2、多播委托,40,PPT学习交流,委托Delegate(4),多播委托引用多个方法的委托,它连续调用每个方法。为了把委托的单个实例合并为一个多播委托,委托必须是同类型的,返回类型必须是void,不能带输出参数(可以带引用参数)。多播委托应用于事件模型中。,41,PPT学习交流,几个重要的概念-委托,委托是一种引用方法的类型,是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示:publicdelegateintPerformCalculation(intx,inty);将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择。,42,PPT学习交流,几个重要的概念-回调,回调方法是一种在操作或活动完成时由委托自动调用的方法。例如,某一异步设计模式使用AsyncCallback委托指定在异步操作完成时执行的代码。该设计模式用在BeginWrite方法中处理异步写操作的结果。事件是与回调类似的机制。事件允许在特定的情况下执行用户指定的代码,这些情况通常涉及状态更改或活动的开始或结束。事件比回调易于使用,因为语言语法和工具为识别和处理事件提供了统一的编码做法。此外,事件由称为事件处理程序的委托处理,这些委托具有定义完善的签名模式。,43,PPT学习交流,3.2.1TCP异步通信流程,建立连接发送与接收,44,PPT学习交流,3.2.2线程阻塞与异步中的同步问题,异步编程看上去不用等待执行完成就能进行下一步的操作,但实际上所用的资源没有准备好也是不行的,会出现错误.在.NET中,用EventWaitHandler即事件等待句柄来表示线程的同步事件.这个类共有两个子类:AutoResetEventManualResetEvent,45,PPT学习交流,由于资源访问的问题,线程之间需要进行同步。.NET中允许线程通过操作系统互相发送信号,以达到同步的目的。EventWaitHandle类:Reset将事件状态设置为非终止状态,导致线程阻止。Set将事件状态设置为终止状态,允许一个或多个等待线程继续。WaitAll已重载。等待指定数组中的所有元素都收到信号。(从WaitHandle继承。)WaitAny已重载。等待指定数组中的任一元素收到信号。(从WaitHandle继承。)WaitOne已重载。当在派生类中重写时,阻止当前线程,直到当前的WaitHandle收到信号。(从WaitHandle继承。),46,PPT学习交流,3.3开发异步的TCP聊天程序,3.3.1客户端程序设计3.3.2客户端业务逻辑设计3.3.3服务器端设计3.3.4服务器端业务逻辑设计3.3.5运行界面,47,PPT学习交流,开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 韩语五级试题及答案
- 物业案场培训
- 木牍教育数学课程体系
- 血透室肌肉痉挛护理查房
- 脑血管病变病人的护理
- 2025年中国母乳喂养乳头罩行业市场全景分析及前景机遇研判报告
- 会计总账业务流程规范
- 餐饮企业租赁及品牌输出服务合同
- 航空公司新员工入职培训
- 车辆无偿租赁与品牌形象展示协议
- 2024-2030年中国激光水平仪行业市场发展趋势与前景展望战略分析报告
- 疑难病例讨论课件
- 部编本小学语文六年级下册毕业总复习教案
- JB∕T 11864-2014 长期堵转力矩电动机式电缆卷筒
- 小儿氨酚黄那敏颗粒的药动学研究
- 生态环境行政处罚自由裁量基准
- 长沙市开福区2024届六年级下学期小升初数学试卷含解析
- 2024年安徽普通高中学业水平选择性考试化学试题及答案
- DZ/T 0462.3-2023 矿产资源“三率”指标要求 第3部分:铁、锰、铬、钒、钛(正式版)
- 2024年昆明巫家坝建设发展有限责任公司招聘笔试冲刺题(带答案解析)
- 《取水许可核验报告编制导则(试行)(征求意见稿)》
评论
0/150
提交评论