




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章TCP应用编程 5 1TCP应用编程概述5 2利用同步TCP编写网络聊天程序上机报告5 3利用同步TCP编写网络游戏5 4异步TCP应用编程5 5异步TCP编程举例 第5章TCP应用编程 续 本章教学目的通过学习 使学生掌握涉及的知识点 能对TCP同步编程流程有深入认识 并熟悉异步TCP编程的基本概念和异步TCP应用编程的一般方法 本章教学要求 1 掌握TCP的特点 涉及到相关类 TCP应用编程的一般步骤以及怎样解决无消息边界问题 2 掌握同步TCP编程的流程和使用方法 3 掌握异步设计模式 异步TCP应用编程的一般方法 教学难点和重点TCP应用编程的一般步骤 如何开辟多线程与多个客户打交道 如何实现服务器和客户端相关功能 异步设计模式实现 5 1TCP应用编程概述 5 1 1TCP简介5 1 2TcpListener类与TcpClient类5 1 3TCP应用编程的一般步骤5 1 4TCP的无消息边界问题 5 1 1TCP简介 TCP是TransmissionControlProtocol 传输控制协议 的简称 是TCP IP体系中面向连接的运输层协议 在网络中提供全双工的和可靠的服务 TCP最主要的特点 1 是面向连接的传输层协议 2 每个TCP连接只能有两个端点 而且只能一对一通信 不能一点对多点直接通信 3 通过TCP连接传送的数据 能保证数据无差错 不丢失 不重复地准确到达接收方 并且保证各数据到达的顺序与数据发出的顺序相同 4 数据以字节流的方式传输 5 传输的数据无消息边界 5 1 1TCP简介 续 利用TCP开发应用程序时 NET框架提供两种工作方式 1 同步工作方式指利用TCP编写的程序执行到发送 接收或监听语句时 在未完成工作前不再继续往下执行 即处于阻塞状态 直到该语句完成相应的工作后才继续执行下一条语句 2 异步工作方式异步工作方式是指程序执行到发送 接收或监听语句时 不论工作是否完成 都会继续往下执行 例如 同步接收数据时 接收方执行到接收语句后将处于阻塞方式 只有接收到对方发来的数据后才继续执行下一条语句 而如果采用异步工作方式 则接收方在执行到接收语句后 无论是否接收到对方发来的数据 程序都继续往下执行 5 1 1TCP简介 续 思考 这里的同步TCP和异步TCP与线程同步异步是否概念是否相同 回答 1 这里的同步TCP和异步TCP仅仅指工作方式 它和线程间的同步不是一个概念 2 线程间的同步指不同线程或其共享资源具有先后关联的关系 而同步TCP和异步TCP则仅仅指TCP编程中采用哪种工作方式 即是从执行到发送 接收或监听语句时 程序是否继续往下执行这个角度来说的 5 1 2TcpListener类与TcpClient类 TcpListener类与TcpClient类两个类均封装了底层的套接字 并分别提供了对套接字进一步封装后的同步和异步操作的方法 降低了TCP应用编程的难度 TcpListener类用于侦听和接受传入的连接请求 TcpClient类用于提供本地主机和远程主机的连接信息 注意 TcpListener和TcpClient只支持标准协议编程 如果希望编写非标准协议的程序 只能使用套接字来实现 5 1 2TcpListener类与TcpClient类 续 TcpListener类TcpLISTener类在System Net Socket命名空间下 常用的构造函数有两种 TcpListener IPEndPointiep TcpListener IPAddresslocalAddr intport 举例 IPAddressipAddress Dns Resolve localhost AddressList 0 Try TcpListenertcpListener newTcpListener ipAddress 1326 catch Exceptione Console WriteLine e ToString 5 1 2TcpListener类与TcpClient类 续 在同步工作方式下 TcpListener类常用的方法 Start启动监听 构造函数为 publicvoidStart intbacklog 参数backlog为请求队列的最大长度 即最多允许的的客户端请求连接个数 Stop关闭TcpListener并停止监听请求 构造函数为 publicvoidStop AcceptSocket在同步阻塞方式下获取并返回一个用来接收和发送数据的Socket对象 同时从传入的连接队列中移除该客户端的连接请求 AcceptTcpClient在同步阻塞方式下获取并返回一个封装了Socket的TcpClient对象 同时从传入的连接队列中移除该客户端的连接请求 5 1 2TcpListener类与TcpClient类 续 TcpClient类TcpClient类在System Net Socket命名空间下 主要用于编写客户端程序 且需要直接利用构造函数创建TcpClient对象 而服务器端程序中是通过TcpListener对象的AcceptTcpClient方法得到TcpClient对象的 所以不需要使用TcpClient类的构造函数来创建TcpClient对象 构造函数有四种重载形式TcpClient TcpClient AddressFamilyfamily TcpClient IPEndPointiep TcpClient stringhostname intport 5 1 2TcpListener类与TcpClient类 续 1 TcpClient 该构造函数创建一个默认的TcpClient对象 并自动分配本机 客户端 IP地址和端口号 利用此构造函数创建对象后 还必须调用Connect方法与服务器建立连接 例如 TcpClienttcpClient newTcpClient tcpClient Connect 51888 5 1 2TcpListener类与TcpClient类 续 2 TcpClient AddressFamilyfamily 该构造函数创建的TcpClient对象也能自动分配本机 客户端 IP地址和端口号 但是使用AddressFamily枚举指定使用哪种网络协议 创建该对象后 必须调用Connect方法与服务器建立连接 例如 TcpClienttcpClient newTcpClient AddressFamily InterNetwork tcpClient Connect 51888 5 1 2TcpListener类与TcpClient类 续 3 TcpClient IPEndPointiep 该构造函数的参数iep指定本机 客户端 IP地址与端口号 当客户端有一个以上的IP地址时 而且程序员希望直接指定使用的IP地址和端口号 可以使用这种方式 如果使用这种方式 必须调用Connect方法与服务器建立连接 例如 IPAddress address Dns GetHostAddresses Dns GetHostName IPEndPointiep newIPEndPoint address 0 51888 TcpClienttcpClient newTcpClient iep tcpClient Connect 51888 5 1 2TcpListener类与TcpClient类 续 4 TcpClient stringhostname intport 这是使用最方便的一种构造函数 参数中的hostname表示要连接到的远程主机的DNS名 port表示要连接到的远程主机的端口号 该构造函数会自动分配最合适的本地主机IP地址和端口号 并对DNS进行解析 然后与远程主机建立连接 例如 TcpClienttcpClient newTcpClient 51888 它相当于 TcpClienttcpClient newTcpClient tcpClientConnect 51888 5 1 2TcpListener类与TcpClient类 续 TcpClient类的常用属性 5 1 2TcpListener类与TcpClient类 续 TcpClient类的常用方法 5 1 2TcpListener类与TcpClient类 续 TcpClient用法举例 TcpClienttcpClient newTcpClient tcpClient Connect contosoServer 11000 NetworkStreamnetworkStream tcpClient GetStream networkStream ReadTimeout 10 byte bytes newbyte 1024 networkStream Read bytes 0 1024 stringdata Encoding UTF8 GetString bytes networkStream Close tcpClient Close 5 1 3TCP应用编程的一般步骤 不论是多么复杂的TCP应用程序 网络通信的最基本前提就是客户端要先和服务器建立TCP连接 然后才可以在此基础上相互传输数据 由于服务器需要同时为多个客户端服务 因此程序相对复杂一些 在服务器端 程序员需要编写程序不断地监听客户端是否有连接请求 一旦接受了客户端连接请求 即能识别是哪个客户 而客户端与服务器连接则相对比较简单 只需要指定连接哪个服务器即可 一旦双方建立了连接并创建了对应的套接字 就可以相互传输数据了 在程序中 发送和接收数据的方法都是一样的 区别仅是方向不同 5 1 3TCP应用编程的一般步骤 续 编写服务器端程序的一般步骤为 使用对套接字封装后的类 编写基于TCP的服务器端程序的一般步骤为 1 创建一个TcpListener对象 然后调用该对象的Start方法在指定的端口进行监听 2 在单独的线程中 循环调用AcceptTcpClient方法接受客户端的连接请求 并根据该方法的返回的结果得到与该客户端对应的TcpClient对象 3 每得到一个新的TcpClient对象 就创建一个与该客户对应的线程 在线程中与对应的客户进行通信 4 根据传送信息的情况确定是否关闭与客户的连接 5 1 3TCP应用编程的一般步骤 续 编写客户端程序的一般步骤为 使用对套接字封装后的类 编写基于TCP的客户端程序的一般步骤如下 1 利用TcpClient的构造函数创建一个TcpClient对象 2 使用Connect方法与服务器建立连接 3 利用TcpClient对象的GetStream方法得到网络流 然后利用该网络流与服务器进行数据传输 4 创建一个线程监听指定的端口 循环接收并处理服务器发送过来的信息 5 完成工作后 向服务器发送关闭信息 并关闭与服务器的连接 5 1 4TCP的无消息边界问题 在网络传输中 可能会出现发送方一次发送的消息与接收方一次接收的消息不一致的现象 这主要是因为TCP协议是字节流形式的 无消息边界的协议 由于受网络传输中的不确定因素的影响 因此不能保证单个Send方法发送的数据被单个Receive方法读取 实际应用中 解决TCP协议消息边界问题的方法有三种 发送固定长度的消息 该方法适用于消息长度固定的场合 将消息长度与消息一起发送 这种方法适用于任何场合 使用特殊标记分隔消息 这种方法主要用于消息中不包含特殊标记的场合 5 2利用同步TCP编写网络聊天程序 例5 1 利用同步TCP和BinaryReader及BinaryWriter对象编写一个简单的网络聊天程序 功能要求 1 任何一个客户端 均可以与服务器进行通信 2 服务器要能显示客户端连接的状态 当客户端连接成功后 要自动及时告知客户端已经连接成功的信息 并将当前在线的所有客户告知该客户端 3 客户和服务器建立连接后 即可以通过服务器和任一个在线的其他客户聊天 4 不论客户何时退出程序 服务器都要做出正确判断 同时将该客户是否在线的情况告诉其他所有在线的客户 5 2利用同步TCP编写网络聊天程序 续 服务器端设计界面 图5 1服务器设计界面 5 2利用同步TCP编写网络聊天程序 续 客户端设计界面 图5 2聊天客户端设计界面 5 2利用同步TCP编写网络聊天程序 续 运行效果 图5 3例5 1的运行效果 5 3利用同步TCP编写网络游戏 例5 2 编写一个可以通过因特网对弈的 吃棋子 游戏 功能要求 1 服务器可以同时服务多桌 每桌允许两个玩家通过因特网对弈 2 允许玩家自由选择坐在哪一桌的哪一方 如果两个玩家坐在同一桌 双方应都能看到对方的状态 两个玩家均单击 开始 按钮 游戏就开始了 3 某桌游戏开始后 服务器以固定的时间间隔同时在15 15的棋盘方格内向该桌随机地发送黑白两种颜色的棋子位置 客户端程序接收到服务器发送的棋子位置和颜色后 在15 15棋盘的相应位置显示棋子 4 玩家坐到游戏桌座位上后 不论游戏是否开始 该玩家都可以随时调整服务器发送棋子的时间间隔 5 3利用同步TCP编写网络游戏 续 5 游戏开始后 客户端程序响应鼠标单击 每当玩家单击了某个棋子 该棋子就会从棋盘上消失 同时具有相应颜色的玩家得1分 注意 如果玩家单击了对方颜色的棋子 则对方得1分 6 如果两个相同颜色的棋子在水平方向或垂直方向是相邻的 那么就认为这两个棋子是相邻的 这里不考虑对角线相邻的情况 如果相同颜色的棋子出现在相邻的位置 游戏就结束了 该颜色对应的玩家就是失败者 7 同一桌的两个玩家可以聊天 这个游戏虽然比较简单 但却是 麻雀虽小 五脏俱全 如果读者真正理解了编写的方法 就可以轻松编写各类基于C S模式的因特网应用程序 5 3利用同步TCP编写网络游戏 续 服务器端编程服务器启动服务后 需要创建一个线程专门用于监听玩家的连接请求 在监听线程中 服务器一旦接受一个连接 就创建一个与该玩家对应的线程 用于接收该玩家发送的信息 并根据该玩家发送的信息提供相应的服务 有多少个玩家连接 就创建多少个对应的线程 玩家退出游戏室 其对应的线程自动终止 服务器可以限制进入游戏室的玩家数量 具体可以同时进入多少玩家 可以根据服务器内存容量以及服务器运行速度决定 在与每个玩家对应的线程中 服务器收到对应玩家发送的字符串信息后 需要解析字符串的含义 并决定服务器需要的操作 5 3利用同步TCP编写网络游戏 续 服务器端设计界面 图5 4服务器设计界面 5 3利用同步TCP编写网络游戏 续 客户端编程客户端与服务器连接成功后 需要创建一个接收线程 用于接收服务器发送的信息 在接收线程中 客户端收到服务器发送的字符串信息后 也需要解析字符串的含义 并决定需要的操作 客户端还需要根据服务器发送的命令 及时更新客户端程序的运行界面 5 3利用同步TCP编写网络游戏 续 客户端设计界面 1 图5 5棋盘棋子与设计界界面 5 3利用同步TCP编写网络游戏 续 客户端设计界面 2 图5 6客户端FormPlaying cs的设计界面 5 4异步TCP应用编程 5 4 1异步设计模式概述5 4 2异步TCP应用编程的一般方法5 4 3使用异步方式调用同步方法 5 4 1异步编程模式概述 什么是异步编程异步操作方式 某个工作开始以后 能在这个工作尚未完成的时候继续处理其他工作 异步操作一般在单独的线程中执行 调用异步方法异步执行某个操作时 可同时继续执行该异步方法后面的代码 异步编程 使用异步操作方式编写程序 异步编程用于异步操作执行完成时间可能较长的任务 如打开大文件 连接远程计算机或查询数据库等 异步编程的两种设计模式 基于事件的异步设计模式 简化异步编程复杂度 适用一般程序员基于IAsyncResult的异步设计模式 功能全 适用有经验的程序员 5 4 1异步编程模式概述 续 基于事件的异步设计模式该模式用事件驱动模型实现异步方法 这种模式用单独的线程在后台执行耗时的任务 当后台任务完成时 就自动触发对应的事件 优点 该模式既具有多线程应用程序的优点 同时也隐匿了多线程设计中固有的许多复杂问题 例如 BackgroundWorker组件 PictureBox控件 5 4 1异步编程模式概述 续 在 NET中 提供异步处理功能的有 文件I O 流I O 套接字I O 网络 远程处理信道 HTTP TCP 和代理 使用ASP NET创建的XMLWebservices ASP NETWeb窗体 使用MessageQueue类的消息队列 BackgroundWorker等组件 5 4 1异步编程模式概述 续 基于事件的异步设计模式的特点 例子见设计型实验preMainForm cs 用事件驱动模型实现异步方法 适用于绝大多数异步应用 降低了异步编程的复杂性 建议尽量使用这种设计模式 具有多线程应用程序的优点 同时隐匿了多线程设计中固有的许多复杂问题 在 后台 执行耗时任务 例如下载和数据库操作 但不会中断应用程序 当后台任务完成时 就自动触发对应的事件 可以同时执行多个操作 每个操作完成时都会接到通知 后台等待资源时 不会停止 挂起 应用程序 使用熟悉的事件和委托模型与挂起的异步操作通信 支持基于事件的异步模式的类一般都有一个或多个后缀为 Async 的方法 该类还可能有一个后缀为 Completed 的事件 以及后缀为 AsyncCancel 或只有CancelAsync 的方法 5 4 1异步编程模式概述 续 支持基于事件的异步设计模型的组件或控件举例PictureBox控件 提供了异步的LoadAsync方法 比如异步下载图像 程序调用LoadAsync方法时 会继续执行该语句后面的语句 而下载操作将在另一个线程上 后台 进行 下载完成时 线程会自动触发LoadCompleted事件 基于事件的异步模式要求异步操作可以取消 PictureBox提供的与之对应的方法名为CancelAsync BackgroundWork组件 能完成绝大多数异步编程功能 建议尽量使用它实现异步操作 除了这两个以外 其他很多组件或控件也支持异步操作 例如SoundPlayer组件 WebClient类等 5 4 1异步编程模式概述 续 基于IAsyncResult的异步设计模式通过前缀分别为 Begin 和 End 的两个方法实现开始和结束异步操作 例如FileStream类提供BeginRead和EndRead方法来从文件异步读取字节 程序在调用Begin 后 可以在调用线程上继续执行其下面的指令 同时异步操作在另一个线程上执行 Begin 方法开始异步操作 并返回一个实现IAsyncResult接口的对象 IAsyncResult对象存储有关异步操作的状态信息 这些信息包括 IAsyncState 可选的特定的对象 包含异步操作需要的信息 AsyncWaitHandle 用于在异步操作完成前阻止程序执行 CompletedSynchronously 指示异步操作是否在用于调用Begin 的线程上完成 而不是在单独的ThreadPool线程上完成 IsCompleted 一个布尔值 指示异步操作是否已完成 特点适用面广 灵活性高 但学习起来比事件设计模式复杂 每次调用Begin 后 程序还应调用End 来获取操作的结果 5 4 1异步编程模式概述 续 1 Begin方法和end方法成对出现 程序调用异步操作的Begin 方法时 系统会自动在线程池中创建对应的线程进行异步操作 从而保证调用方和被调用方同时执行 2 当线程池中的Begin 方法执行完毕时 会自动通过AsyncCallback委托调用在Begin 方法的参数中指定的回调方法 5 4 1异步编程模式概述 续 如何理解异步设计模式 对比举例 5 4 2异步TCP应用编程的一般方法 使用异步TCP编程时 除了套接字有对应的异步操作方式外 TcpListener和TcpClient类均提供了返回结果为IasyncResult类型的异步操作的方法 见下页表 5 4 2异步TCP应用编程的一般方法 1 BeginAcceptTcpClient方法和EndAcceptTcpClient方法BeginAcceptTcpClient 程序执行BeginAcceptTcpClient方法后 会立即在线程池中自动创建一个线程 同时在该线程中监听客户端连接请求 一旦接受了客户端连接请求 就通过委托执行相应的方法 并返回状态信息 publicIAsyncResultBeginAcceptTcpClient AsyncCallbackcallback Objectstate 参数1 AsyncCallback类型的委托 参数2 Object类型 用于将状态信息传递给委托调用的方法 回调方法名 5 4 2异步TCP应用编程的一般方法 1 BeginAcceptTcpClient方法和EndAcceptTcpClient方法回调方法中传递的参数只有一个 而且必须是IAsyncResult类型的接口 它表示异步操作的状态 如果有多个状态需要传递 可以将其事先封装到某个类中AsyncCallbackcallback newAsyncCallback AcceptClient tcpListener BeginAcceptTcpClient callback tcpListener voidAcceptClient IAsyncResultar TcpListenermyListener TcpListener ar AsyncState TcpClientclient myListener EndAcceptTcpClient ar 5 4 2异步TCP应用编程的一般方法 2 BeginConnect方法和EndConnect方法在BeginConnect方法操作完成前 调用该方法的线程不会阻塞 系统会自动用独立的线程来执行该方法 直到与远程主机连接成功或抛出异常 publicIAsyncResultBeginConnect IPAddressaddress intport AsyncCallbackrequestCallback Objectstate 参数 address为远程主机的IPAddress对象 port为远程主机的端口号 requestCallback为AsyncCallback类型的委托 state为包含连接操作的相关信息 当操作完成时 此对象会被传递给requestCallback委托 5 4 2异步TCP应用编程的一般方法 2 BeginConnect方法和EndConnect方法 AsyncCallbackrequestCallback newAsyncCallback FinishConnect tcpClient BeginConnect 远程主机IP或域名 远程主机端口号 requestCallback tcpClient voidFinishConnect IAsyncResultar tcpClient TcpClient ar AsyncState client EndConnect ar 在自定义的FinishConnect方法中 通过获取的状态信息得到新的TcpClient类型的对象 并调用EndConnect完成连接请求 同步参数 委托 Object参数 5 4 2异步TCP应用编程的一般方法 3 异步发送和接收数据publicoverrideIAsyncResultBeginWrite byte buffer intoffset intsize AsyncCallbackcallback Obje
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 濮阳市中石油2025秋招面试半结构化模拟题及答案油品分析质检岗
- 宝鸡市中石化2025秋招笔试模拟题含答案炼油设备技术岗
- 中国联通普洱市2025秋招面试典型题目及答案
- 中国广电云南地区2025秋招综合管理类专业追问清单及参考回答
- 国家能源南宁市2025秋招面试专业追问及参考能源与动力工程岗位
- 中国移动大庆市2025秋招心理测评常考题型与答题技巧
- 定西市中石化2025秋招写作申论万能模板直接套用
- 宁波市中石油2025秋招笔试模拟题含答案油气储运与管道岗
- 丹东市中石化2025秋招笔试模拟题含答案炼油设备技术岗
- 中国广电济宁市2025秋招网络优化与维护类专业追问清单及参考回答
- 多格列艾汀片-药品临床应用解读
- 图书馆外文图书分编工作细则
- 干漆膜(涂层)厚度检测报告
- 过氧化氢异丙苯安全技术说明书MSDS
- GB/T 3098.4-2000紧固件机械性能螺母细牙螺纹
- 【演练方案】特种设备事故(压力容器)应急预案
- 全新档案法专题学习讲座课件
- 六年级上册道德与法治课件第四单元第8课
- 量具使用知识培训课件
- 感动中国人物-于敏
- Q-RJ 557-2017 航天型号产品禁(限)用工艺目录(公开)
评论
0/150
提交评论