TCP协议的编程与开发技术ppt课件.ppt_第1页
TCP协议的编程与开发技术ppt课件.ppt_第2页
TCP协议的编程与开发技术ppt课件.ppt_第3页
TCP协议的编程与开发技术ppt课件.ppt_第4页
TCP协议的编程与开发技术ppt课件.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

TCP协议的编程与开发技术 3 1套接字与TCP协议 3 1 1使用套接字传输数据3 1 2NetworkStream对象与数据的发送与接收3 1 3TCPClient与TCPListener类3 1 4使用TCP IP协议编写通信代码 3 1 1使用套接字传输数据P58 服务器端的工作原理 ClientService类的结构 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 3 1 2NetworkStream对象 NetworkStream的常用方法 3 1 3TCPClient与TCPListener类 TCPClient 可以比Socket更方便地构造客户端程序 的构造函数名称说明TcpClient 初始化TcpClient类的新实例 由 NETCompactFramework支持 TcpClient AddressFamily 使用指定的族初始化TcpClient类的新实例 由 NETCompactFramework支持 TcpClient IPEndPoint 初始化TcpClient类的新实例 并将其绑定到指定的本地终结点 由 NETCompactFramework支持 TcpClient String Int32 初始化TcpClient类的新实例并连接到指定主机上的指定端口 由 NETCompactFramework支持 TCPListener 可以提供方便的方式构造TCP的服务器端构造函数 TcpListener intport TcpListener IPEndPointipe TcpListener IPAddressaddr intport TCPListener的主要方法请看P65P60 C 中的委托详解 委托和事件 委托和事件在 NetFramework中的应用非常广泛 然而 较好地理解委托和事件对很多接触C 时间不长的人来说并不容易 它们就像是一道槛儿 过了这个槛的人 觉得真是太容易了 而没有过去的人每次见到委托和事件就觉得混身不自在 通过两个范例由浅入深地讲述 什么是委托 为什么要使用委托 委托 事件的由来 NetFramework中的委托和事件委托和事件对Observer设计模式的意义 其实质是 将方法作为方法的参数 先看下面这两个最简单的方法 它们不过是在屏幕上输出一句问候的话语 publicvoidGreetPeople stringname 做某些额外的事情 比如初始化之类 此处略EnglishGreeting name publicvoidEnglishGreeting stringname Console WriteLine Morning name GreetPeople用于向某人问好 当传递姓名 比如说 Jimmy 进去的时候 将调用EnglishGreeting方法 再把name参数传给EnglishGreeting name EnglishGreeting则用于向屏幕输出 Morning Jimmy 现在假设这个程序需要进行全球化 如果面对中国人 不明白 Morning 是什么意思 怎么办呢 好吧 我们再加个中文版的问候方法 publicvoidChineseGreeting stringname Console WriteLine 早上好 name 如何判断到底用哪个版本的Greeting问候方法合适呢 最好再定义一个枚举作为判断的依据 publicenumLanguage English Chinese GreetPeople进行相应的修改 publicvoidGreetPeople stringname Languagelang 做某些额外的事情 比如初始化之类 此处略swith lang caseLanguage English EnglishGreeting name break caseLanguage Chinese ChineseGreeting name break 但是 此方案的可扩展性很差 OK 尽管这样解决了问题 但这个解决方案的可扩展性很差 如果日后我们需要再添加韩文版 日文版 就不得不反复修改枚举和GreetPeople 方法 以适应新的需求 在考虑新的解决方案之前 我们先看看GreetPeople的方法签名 publicvoidGreetPeople stringname Languagelang publicvoidGreetPeople stringname Languagelang 我们仅看stringname 在这里 string是参数类型 name是参数变量 当我们赋给name字符串 jimmy 时 它就代表 jimmy 这个值 当我们赋给它 张子阳 时 它又代表着 张子阳 这个值 再仔细想想 假如GreetPeople 方法可以接受一个参数变量 这个变量可以代表另一个方法 当我们给这个变量赋值EnglishGreeting的时候 它代表着EnglsihGreeting 这个方法 当我们给它赋值ChineseGreeting的时候 它又代表着ChineseGreeting 方法 我们将这个参数变量命名为MakeGreeting 那么不是可以如同给name赋值时一样 在调用GreetPeople 方法的时候 给这个MakeGreeting参数也赋上值么 ChineseGreeting或者EnglsihGreeting等 然后 我们在方法体内 也可以像使用别的参数一样使用MakeGreeting 但是 由于MakeGreeting代表着一个方法 它的使用方式应该和它被赋的方法 比如ChineseGreeting 是一样的 比如 适应性改造 好了 有了思路了 我们现在就来改改GreetPeople 方法 那么它应该是这个样子了 publicvoidGreetPeople stringname MakeGreeting MakeGreeting name 这个 是什么类型呢 本例中委托的定义 publicdelegatevoidGreetingDelegate stringname 可以与上面EnglishGreeting 方法的签名对比一下 除了加入了delegate关键字以外 其余的是不是完全一样 现在 让我们再次改动GreetPeople 方法 如下所示 publicvoidGreetPeople stringname GreetingDelegateMakeGreeting MakeGreeting name 总结 委托是一个类 它定义了方法的类型 使得可以将方法当作另一个方法的参数来进行传递 这种将方法动态地赋给参数的做法 可以避免在程序中大量使用If Else Switch 语句 同时使得程序具有更好的可扩展性 一个更好的委托的例子 上面的例子显然能完成我们之前描述的工作 但是却并不够好 现在假设热水器由三部分组成 热水器仅仅负责烧水 它不能发出警报也不能显示水温 警报器发出警报显示器提示和水温 先用代码完成最基本的功能 热水器publicclassHeater privateinttemperature 烧水privatevoidBoilWater for inti 0 i 100 i temperature i 警报器publicclassAlarm privatevoidMakeAlert intparam Console WriteLine Alarm 嘀嘀嘀 水已经 0 度了 param 显示器publicclassDisplay privatevoidShowMsg intparam Console WriteLine Display 水已烧开 当前温度 0 度 param 类之间的协调如何解决 这里就出现了一个问题 如何在水烧开的时候通知报警器和显示器 在继续进行之前 需要先了解一下Observer设计模式 Observer设计模式中主要包括如下两类对象 Observer设计模式 Subject 被监视对象 它往往包含着其他对象所感兴趣的内容 在本范例中 热水器就是一个监视对象 它包含的其他对象所感兴趣的内容 就是temprature字段 当这个字段的值快到100时 会不断把数据发给监视它的对象 Observer 监视者 它监视Subject 当Subject中的某件事发生的时候 会告知Observer 而Observer则会采取相应的行动 在本范例中 Observer有警报器和显示器 它们采取的行动分别是发出警报和显示水温 在本例中 事情发生的顺序应该是这样的 1 警报器和显示器告诉热水器 它对它的温度比较感兴趣 注册 2 热水器知道后保留对警报器和显示器的引用 3 热水器进行烧水这一动作 当水温超过95度时 通过对警报器和显示器的引用 自动调用警报器的MakeAlert 方法 显示器的ShowMsg 方法 Observer设计模式 类似这样的例子是很多的 称为Observer设计模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系 以便于当一个对象的状态改变时 其他依赖于它的对象会被自动告知并更新 Observer模式是一种松耦合的设计模式 请看例2 3 2开发异步的TCP编程 3 2 1TCP异步通信流程3 2 2线程阻塞与异步中的同步问题 同步编程的好处易于理解与实现通信量小的时候更有效率但是经常会进入阻塞状态 给个例子 几个重要的概念 异步 大家先想一下在饭店点菜的过程 异步操作通常用于执行完成时间可能较长的任务 如打开大文件 连接远程计算机或查询数据库 异步操作在主应用程序线程以外的线程中执行 NETFramework为异步操作提供两种设计模式 使用IAsyncResult对象的异步操作 使用事件的异步操作 IAsyncResult设计模式允许多种编程模型 但更加复杂不易学习 可提供大多数应用程序都不要求的灵活性 几个重要的概念 异步 基于事件的异步模式具有多线程应用程序的优点 同时隐匿了多线程设计中固有的许多复杂问题 使用支持此模式的类 您将能够 在后台 执行耗时任务 例如下载和数据库操作 但不会中断您的应用程序 同时执行多个操作 每个操作完成时都会接到通知 等待资源变得可用 但不会停止 挂起 您的应用程序 几个重要的概念 异步 支持异步模式的类有一个或多个名为MethodNameAsync的方法 还可能有一个MethodNameCompleted事件 或者会有一个MethodNameAsyncCancel 或只是CancelAsync 方法 几个重要的概念 异步 异步调用的一般模式 异步回调函数是基于windows操作系统的事件处理机制 用户先把要处理的事件向操作系统进行注册 操作系统负责把程序的控制传向所委托的方法 不同的事件对应不同的回调函数 请研究表3 6 几个重要的概念 异步 异步类的定义例子 这里虚构的AsyncExample类有两个方法 都支持同步和异步调用 几个重要的概念 异步 异步方法重载异步操作可以有两个重载 单调用和多调用 您可以通过方法签名来区分这两种形式 多调用形式有一个额外的参数 即userState 使用这种形式 您的代码可以多次调用Method1Async stringparam objectuserState 而不必等待任何挂起的异步操作的完成 另一方面 如果您尝试在前一个调用尚未完成时调用Method1Async stringparam 该方法将引发InvalidOperationException 多调用重载的userState参数可帮助您区分各个异步操作 您应分别为各个Method1Async stringparam objectuserState 调用提供一个唯一值 例如GUID或哈希代码 这样 当各个操作完成时 您的事件处理程序便可以确定哪个操作的实例引发了完成事件 在为您对多调用重载的调用中的userState提供唯一值时 一定要小心 如果任务ID不唯一 将导致异步类引发ArgumentException 预备知识 需要有基本的Windows编程基础 能够使用现有的Windows控件触发事件编程 几个重要的概念 委托 委托Delegate 1 想象成C 中的函数指针 但不同点在与delegate完全面向对象的 既封装方法又封装对象实例定义一个委托实际上是定义一个类型的委托 不是一个具体的实例 委托类型指定它代表的方法的返回类型和参数表它代表具有相同参数列表和返回类型的任何方法 委托Delegate 2 委托的声明方式和方法的声明类似 包括的是delegate关键字声明中必须包括委托所表示的方法的返回类型和参数列表 delegate argument list 例 publicdelegateboolProcessAnything doubled 创建委托实例 new关键字例 ProcessAnythingpa newProcessAnything account Withdraw 括号里面是实例方法 此方法必须和代理声明时的返回类型和参数列表相同 委托Delegate 3 委托的调用时通过输入委托实例的名称和要传递委托所表示的方法的参数 委托分为 1 一般委托2 多播委托 委托Delegate 4 多播委托 引用多个方法的委托 它连续调用每个方法 为了把委托的单个实例合并为一个多播委托 委托必须是同类型的 返回类型必须是void 不能带输出参数 可以带引用参数 多播委托应用于事件模型中 几个重要的概念 委托 委托是一种引用方法的类型 是一种数据结构 它引用静态方法或引用类实例及该类的实例方法 一旦为委托分配了方法 委托将与该方法具有完全相同的行为 委托方法的使用可以像其他任何方法一样 具有参数和返回值 如下面的示例所示 publicdelegateintPerformCalculation intx inty 将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择 几个重要的概念 回调 回调方法是一种在操作或活动完成时由委托自动调用的方法 例如 某一异步设计模式使用AsyncCallback委托指定在异步操作完成时执行的代码 该设计模式用在BeginWrite方法中处理异步写操作的结果 事件是与回调类似的机制 事件允许在特定的情况下执行用户指定的代码 这些情况通常涉及状态更改或活动的开始或结束 事件比回调易于使用 因为语言语法和工具为识别和处理事件提供了统一的编码做法 此外 事件由称为事件处理程序的委托处理 这些委托具有定义完善的签名模式 3 2 1TCP异步通信流程 建立连接发送与接收 3 2 2线程阻塞与异步中的同步问题 异步编程看上去不用等待执行完成就能进行下一步的操作 但实际上所用的资源没有准备好也是不行的 会出现错误 在 NET中 用EventWaitHandler即事件等待句柄来表示线程的同步事件 这个类共有两个子类 AutoResetEventManualResetEvent 由于资源访问的问题 线程之间需要进行同步 NET中允许线程通过操作系统互相发送信号 以达到同步的目的 EventWaitHandle类 Reset将事件状态设置为非终止状态 导致线程阻止 Set将事件状态设置为终止状态 允许一个或多个等待线程继续 WaitAll已重载 等待指定数组中的所有元素都收到信号 从WaitHandle继承 WaitAny已重载 等待指定数组中的任一元素收到信号 从WaitHandle继承 WaitOne已重载 当在派生类中重写时 阻止当前线程 直到当前的WaitHandle收到信号 从WaitHandle继承 3 3开发异步的TCP聊天程序 3 3 1客户端程序设

温馨提示

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

最新文档

评论

0/150

提交评论