关闭

关闭

关闭

封号提示

内容

首页 C#网络应用高级编程 教学课件 ppt 作者 马骏 郑逢斌 沈夏炯2 第2章 TCP应用编程.…

C#网络应用高级编程 教学课件 ppt 作者 马骏 郑逢斌 沈夏炯2 第2章 TCP应用编程.ppt.ppt

C#网络应用高级编程 教学课件 ppt 作者 马骏 郑逢斌 …

希望
2019-09-15 0人阅读 举报 0 0 暂无简介

简介:本文档为《C#网络应用高级编程 教学课件 ppt 作者 马骏 郑逢斌 沈夏炯2 第2章 TCP应用编程.pptppt》,可适用于高等教育领域

关于C#网络应用高级编程 教学课件 ppt 作者 马骏 郑逢斌 沈夏炯2 第2章 TCP应用编程.ppt.ppt文档,吉林快3—吉林快三拥有内容丰富的相关文档,站内每天千位行业名人共享最新资料。

*第章TCP应用编程同步TCP应用编程利用同步TCP编写网络游戏异步TCP应用编程异步TCP聊天程序*TCP是TransmissionControlProtocol(传输控制协议)的简称是TCPIP体系中面向连接的运输层协议在网络中提供全双工的和可靠的服务。TCP协议最主要的特点是:)是一种基于连接的协议。)保证数据准确到达。)保证各数据到达的顺序与数据发出的顺序相同。)传输的数据无消息边界。*关于TCP应用编程的几个概念:)同步工作方式用TCP协议进行编程时程序执行到发送、接收和监听语句时在未完成工作前不再继续往下执行即处于阻塞状态直到该语句完成某个工作后才继续执行下一条语句。)异步工作方式程序执行到发送、接收和监听语句时不论工作是否完成都会继续往下执行。*)同步套接字编程与同步工作方式相对应的利用Socket类进行编程时系统提供有相应的方法采用相应的方法进行编程则称为同步套接字编程。)异步套接字编程与异步工作方式相对应的利用Socket类进行编程时系统提供有相应的方法采用相应的方法进行编程则称为异步套接字编程。这里的同步TCP和异步TCP仅仅指工作方式它和第章介绍的线程间的同步不是一个概念。*同步TCP应用编程在同步TCP应用编程中发送、接收和监听语句均采用阻塞方式工作。使用同步TCP编写服务器端程序的一般步骤为:)创建一个包含采用的网络类型、数据传输类型和协议类型的本地套接字对象并将其与服务器的IP地址和端口号绑定。此过程可以通过Socket类或者TcpListener类完成。)在指定的端口进行监听以便接受客户端连接请求。*同步TCP应用编程(续))一旦接受了客户端的连接请求就根据客户端发送的连接信息创建与该客户端对应的Socket对象或者TcpClient对象。)根据创建的Socket对象或者TcpClient对象分别与每个连接的客户进行数据传输。)根据传送信息情况确定是否关闭与对方的连接。*同步TCP应用编程(续)使用同步TCP编写客户端程序的一般步骤为:)创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的Socket对象或TcpClient对象。)使用Connect方法与远程服务器建立连接。)与服务器进行数据传输。)完成工作后向服务器发送关闭信息并关闭与服务器的连接。*使用套接字发送和接收数据服务器与客户端双方建立连接后程序中需要先将要发送的数据转换为字节数组然后使用Socket对象的Send方法发送数据或者使用Receive方法接收数据。*使用NetworkStream对象发送和接收数据NetworkStream对象专门用于对网络流数据进行处理。创建了NetworkStream对象后就可以直接使用该对象接收和发送数据。例如:NetworkStreamnetworkStream=newNetworkStream(clientSocket)helliphellip发送数据stringmessage=发送的数据*使用NetworkStream对象发送和接收数据(续)bytesendbytes=SystemTextEncodingGetBytes(message)networkStreamWrite(sendbytes,,sendbytesLength)helliphellip接收数据bytereadbytes=newbyteinti=networkStreamRead(readbytes,,readbytesLength)NetworkStream对象的Write方法能保证字节数组中的数据全部发送到TCP发送缓冲区中其返回值为void。*TcpClient与TcpListener类在SystemNetSockets命名空间下TcpClient类与TcpListener类是两个专门用于TCP协议编程的类。这两个类封装了底层的套接字并分别提供了对Socket进行封装后的同步和异步操作的方法降低了TCP应用编程的难度。TcpClient类用于连接、发送和接收数据。TcpListener类则用于监听是否有传入的连接请求。*TcpClient与TcpListener类(续)TcpClient类TcpClient类归类在SystemNet命名空间下。利用TcpClient类提供的方法可以通过网络进行连接、发送和接收网络数据流。该类的构造函数有四种重载形式:*)TcpClient()该构造函数创建一个默认的TcpClient对象该对象自动选择客户端尚未使用的IP地址和端口号。创建该对象后即可用Connect方法与服务器端进行连接。例如:*TcpClient与TcpListener类(续)TcpClienttcpClient=newTcpClient()tcpClientConnect(wwwabcdcom,)*)TcpClient(AddressFamilyfamily)该构造函数创建的TcpClient对象也能自动选择客户端尚未使用的IP地址和端口号但是使用AddressFamily枚举指定了使用哪种网络协议。创建该对象后即可用Connect方法与服务器端进行连接。例如:TcpClienttcpClient=newTcpClient(AddressFamilyInterNetwork)tcpClientConnect(wwwabcdcom,)*TcpClient与TcpListener类(续))TcpClient(IPEndPointiep)iep是IPEndPoint类型的对象iep指定了客户端的IP地址与端口号。当客户端的主机有一个以上的IP地址时可使用此构造函数选择要使用的客户端主机IP地址。例如:IPAddressaddress=DnsGetHostAddresses(DnsGetHostName())IPEndPointiep=newIPEndPoint(address,)TcpClienttcpClient=newTcpClient(iep)tcpClientConnect(wwwabcdcom,)*TcpClient与TcpListener类(续))TcpClient(stringhostname,intport)这是使用最方便的一种构造函数。该构造函数可直接指定服务器端域名和端口号而且不需使用connect方法。客户端主机的IP地址和端口号则自动选择。例如:TcpClienttcpClient=newTcpClient(wwwabcdcom,)*TcpClient与TcpListener类(续)TcpListener类TcpListener类用于监听和接收传入的连接请求。该类的构造函数有:)TcpListener(IPEndPointiep)该构造函数通过IPEndPoint类型的对象在指定的IP地址与端口监听客户端连接请求。)TcpListener(IPAddresslocalAddr,intport)建立一个TcpListener对象在参数中直接指定本机IP地址和端口并通过指定的本机IP地址和端口号监听传入的连接请求。*TcpClient与TcpListener类(续)在同步工作方式下TcpListener类对应的方法:AcceptTcpClient:在同步阻塞方式下获取并返回一个用来接收和发送数据的套接字对象)AcceptSocket:在同步阻塞方式下获取并返回一个可以用来接收和发送数据的封装了Socket的TcpClient对象*)Start:启动监听其构造函数为:publicvoidStart(intbacklog)整型参数backlog为请求队列的最大长度即最多允许的客户端连接个数)Stop:停止监听请求构造函数为:publicvoidStop()*解决TCP协议的无消息边界问题有三种:第一种方法是发送固定长度的消息。该方法适用于消息长度固定的场合。第二种方法是将消息长度与消息一起发送。第三种方法是使用特殊标记分隔消息。*利用同步TCP编写网络游戏这个稍微复杂的ldquo吃棋子rdquo游戏是利用TCP协议和同步套接字以及多线程编写的网络应用程序。具体规则及功能见课本。*服务器端编程服务器启动服务后需要创建一个线程专门用于监听玩家的连接请求。在监听线程中服务器一旦接受一个连接就创建一个与该玩家对应的线程用于接收该玩家发送的信息并根据该玩家发送的信息提供相应的服务。有多少个玩家连接就创建多少个对应的线程。玩家退出游戏室其对应的线程自动终止。在与每个玩家对应的线程中服务器收到对应玩家发送的字符串信息后需要解析字符串的含义并决定服务器需要的操作。*利用同步TCP编写网络游戏(续)客户端编程客户端与服务器连接成功后需要创建一个接收线程用于接收服务器发送的信息。在接收线程中客户端收到服务器发送的字符串信息后需要解析字符串的含义并决定需要的操作。另外客户端还需要根据服务器发送的命令及时更新客户端程序的运行界面。*利用同步TCP编写网络游戏(续)代码见课本*异步TCP应用编程TcpListener类)BeginAcceptTcpClient:开始一个异步操作接受一个传入的连接尝试。)EndAcceptTcpClient:异步接受传入的连接尝试并创建新的TcpClient处理远程主机通信。TcpClient类)BeginConnect:开始一个对远程主机连接的异步请求。)EndConnect:异步接受传入的连接尝试。*异步TCP应用编程(续)Socket类)BeginReceive:开始从连接的Socket中异步接收数据。)EndReceive:结束挂起的异步读取。)BeginSend:将数据异步发送到连接的Socket。)EndSend:结束挂起的异步发送。*EventWaitHandle类SystemThreading命名空间下的EventWaitHandle类用于在异步操作时控制线程间的同步即控制一个或多个线程继续执行或者等待其它线程完成。也就是需要同步的线程可以先阻塞当前线程然后根据Windows操作系统发出的信号决定是继续阻塞等待其它工作完成还是不再等待而直接往下执行。*EventWaitHandle类(续)EventWaitHandle类提供的方法有:)Reset:将信号的状态设置为非终止状态即不让操作系统发出信号从而导致等待收到信号才能继续执行的线程阻塞。)Set:将事件状态设置为终止状态这样等待的线程将会收到信号从而继续执行而不再等待。)WaitOne:阻塞当前线程等待操作系统为其发出信号直到收到信号才解除阻塞。*EventWaitHandle类(续)操作系统发出信号的方式有两种:)发一个信号使某个等待信号的线程解除阻塞继续执行。)发一个信号使所有等待信号的线程全部解除阻塞继续执行。*AsynCallback委托AsyncCallback委托用于引用异步操作完成时调用的回调方法。在异步操作方式下由于程序可以在启动异步操作后继续执行其他代码因此必须有一种机制以保证该异步操作完成时能及时通知调用者。这种机制可以通过AsyncCallback委托实现。异步操作的每一个方法都有一个Beginhellip方法和Endhellip方法例如BeginAcceptTcpClient和EndAcceptTcpClient。程序调用Beginhellip方法时系统会自动在线程池中创建对应的线程进行异步操作从而保证调用方和被调用方同时执行当线程*AsynCallback委托(续)池中的Beginhellip方法执行完毕时会自动通过AsyncCallback委托调用在Beginhellip方法的参数中指定的回调方法。回调方法是在程序中事先定义的在回调方法中通过Endhellip方法获取Beginhellip方法的返回值和所有输入输出参数从而达到异步操作方式下完成参数传递的目的。*BeginAcceptTcpClient与EndAcceptTcpClient方法这两个方法包含在SystemNetSockets命名空间下的TcpListener类中。在BeginAcceptTcpClient方法中系统自动利用线程池创建需要的线程同时监听客户端连接请求。一旦接受了客户连接请求就自动通过委托调用提供给委托的方法并返回状态信息。该方法的原型为:publicIAsyncResultBeginAcceptTcpClient(AsyncCallbackcallback,Objectstate)*BeginAcceptTcpClient与EndAcceptTcpClient方法(续)其中:参数为AsyncCallback类型的委托参数为Object类型用于将状态信息传递给委托提供的方法。例如:AsyncCallbackcallback=newAsyncCallback(AcceptTcpClientCallback)tcpListenerBeginAcceptTcpClient(callback,tcpListener)*BeginAcceptTcpClient与EndAcceptTcpClient方法(续)voidAcceptTcpClientCallback(IAsyncResultar){回调代码}AcceptTcpClientCallback方法中传递的参数只有一个而且必须是IAsyncResult类型的接口它表示异步操作的状态。系统会自动将该状态信息从关联的BeginAcceptTcpClient方法传递到AcceptTcpClientCallback方法。在回调代码中必须调用EndAcceptTcpClient方法完成客户端连接。关键代码为:*BeginAcceptTcpClient与EndAcceptTcpClient方法(续)voidAcceptTcpClientCallback(IAsyncResultar){helliphellipTcpListenermyListener=(TcpListener)arAsyncStateTcpClientclient=myListenerEndAcceptTcpClient(ar)helliphellip}默认情况下程序执行BeginAcceptTcpClient方法后在该方法返回状态信息之前不会像同步TCP方式那样阻塞等待客户端连接而是继续往下执行。*BeginConnect与EndConnect方法BeginConnect方法和EndConnect方法包含在命名空间SystemNetSockets下的TcpClient类和Socket类中。在异步TCP应用编程中BeginConnect方法通过异步方式向远程主机发出连接请求。该方法有三种重载的形式方法原型为:publicIAsyncResultBeginConnect(IPAddressaddress,intport,AsyncCallbackrequestCallback,Objectstate)*BeginConnect与EndConnect方法(续)publicIAsyncResultBeginConnect(IPAddressaddresses,intport,AsyncCallbackrequestCallback,Objectstate)publicIAsyncResultBeginConnect(stringhost,intport,AsyncCallbackrequestCallback,Objectstate)其中address为远程主机的IPAddress对象port为远程主机的端口号requestCallback为AsyncCallback类型的委托state为包含连接操作的相关信息当操作完成时此对象会被传递给requestCallback委托。*BeginConnect与EndConnect方法(续)异步BeginConnect方法只有在调用了EndConnect方法之后才算执行完毕。因此程序中需要在提供给requestCallback委托调用的方法中调用TcpClient对象的EndConnect方法。关键代码为:helliphellipAsyncCallbackrequestCallback=newAsyncCallback(RequestCallback)tcpClientBeginConnect(远程主机IP或域名,远程主机端口号,requestCallback,tcpClient)helliphellip*BeginConnect与EndConnect方法(续)voidRequestCallback(IAsyncResultar){helliphelliptcpClient=(TcpClient)arAsyncStateclientEndConnect(ar)helliphellip}在自定义的RequestCallback中通过获取的状态信息得到新的TcpClient类型的对象并调用EndConnect结束连接请求。*发送数据在异步TCP应用编程中在本机已经和远程主机建立连接的前提下可以用SystemNetSockets命名空间下NetworkStream类中的BeginWrite方法发送数据。其方法原型为:publicoverrideIAsyncResultBeginWrite(bytebuffer,intoffset,intsize,AsyncCallbackcallback,Objectstate)其中buffer是一组Byte类型的值用来存放要发送的数据。offset用来存放发送的数据在发送缓冲区中的起始位置。size用来存放发送数据的字节数。callback是异步回调类型的委托state包含状态信息。*发送数据(续)使用BeginWrite方法异步发送数据程序必须创建实现AsyncCallback委托的回调方法并将其名称传递给BeginWrite方法。在BeginWrite方法中状态信息必须至少包含NetworkStream对象。程序调用BeginWrite后系统自动使用单独的线程来执行指定的回调方法并在EndWrite上一直处于阻塞状态直到NetworkStream对象发送请求的字节数或引发异常。关键代码为:*发送数据(续)helliphellipNetworkStreamstream=tcpClientGetStream()helliphellipbytebytesData=SystemTextEncodingGetBytes(strrn)streamBeginWrite(bytesData,,bytesDataLength,newAsyncCallback(SendCallback),stream)streamFlush()helliphellip*发送数据(续)privatevoidSendCallback(IAsyncResultar){helliphellipstreamEndWrite(ar)helliphellip}若希望在BeginWrite方法得到传递的状态信息之前使当前线程(即调用BeginWrite方法的线程)阻塞可以使用ManualResetEvent对象WaitOne方法。并在回调方法中调用Set使当前线程继续执行。*接收数据如果本机已经和远程主机建立了连接就可以用SystemNetSockets命名空间下NetworkStream类中的BeginRead方法接收数据。其方法原型为:publicoverrideIAsyncResultBeginRead(bytebuffer,intoffset,intsize,AsyncCallbackcallback,objectstate)其中buffer为字节数组存储从NetworkStream读取的数据offset为buffer中开始存储数据的位置size为从NetworkStream中读取的字节数callback是在BeginRead完成时执行的AsyncCallback委托state包含用户定义的任何附加数据的对象。*接收数据(续)在程序中必须创建实现AsyncCallback委托的回调方法并将其名称传递给BeginRead方法。state参数必须至少包含NetworkStream对象。一般情况下我们希望在回调方法内获得所接收的数据因此应创建小型的类或结构来保存读取缓冲区以及其它任何有用的信息并通过state参数将结构或类的实例传递给BeginRead方法。*接收数据(续)在回调方法中必须调用EndRead方法完成读取操作。系统执行BeginRead时将一直等待直到数据接收完毕或者遇到错误从而得到可用的字节数然后自动使用一个单独的线程来执行指定的回调方法并阻塞EndRead方法直到所提供的NetworkStream对象将可用数据读取完毕或者达到size参数指定的字节数。关键代码为:*接收数据(续)helliphellipNetworkStreamstream=tcpClientGetStream()helliphellipReadObjectreadObject=newReadObject(stream,clientReceiveBufferSize)streamBeginRead(readObjectbytes,,readObjectbytesLength,ReadCallback,readObject)helliphellipvoidReadCallback(IAsyncResultar){helliphellip*接收数据(续)ReadObjectreadObject=(ReadObject)arAsyncStateintcount=readObjectnetStreamEndRead(ar)处理读取的保存在ReadObject类中的字节数组helliphellip}如果希望在调用BeginRead方法之后使当前线程(即调用BeginRead的线程)阻塞可以使用ManualResetEvent对象的WaitOne方法并在回调方法中调用该对象的Set方法使当前线程继续执行。*异步TCP聊天程序本系统只允许客户与服务器相互传送字符串数据不实现任意客户之间的直接信息传递。服务器允许多个客户同时向服务器发送字符串服务器也可随时向任意一个指定的客户发送信息。代码见课本

类似资料

该用户的其他资料

2015.11创新杯创新杯说课大赛国赛说课课件.ppt

19--课程..创新杯说课大赛国赛说课课件.ppt

2014创新杯直线的倾斜角与斜率课程创新杯说课大赛国赛说课课件.ppt

13幼师3 住创新杯说课大赛国赛说课课件.ppt

2010血栓的形成讲课曹颜冬创新杯说课大赛国赛说课课件.ppt

职业精品

精彩专题

让你惊艳又清新的英文短诗合集

让你清新惊艳的英文小诗有哪些呢?小编汇集了以下经典英文诗、唯美爱情小诗、英文诗押韵技巧等等,让爱好英文短诗的你能够一起体验其中的乐趣!

用户评论

0/200
上传我的资料

热门资料排行换一换

  • ETCR2000系列钳形接地电阻测…

  • 工会法精选试题m

  • 胎心仪怎么用 胎心仪对宝宝有影响吗

  • 计算机二级MS OFFICE演示文…

  • 毕业论文目录中文版

  • 三重一大项目决策表(空表)

  • 思考与练习2 21 试求图257所…

  • 十一学校小升初考试真题汇总

  • 商品房预售合同的效力

  • 资料评价:

    / 50
    所需积分:0 立即下载

    VIP

    在线
    客服

    免费
    邮箱

    吉林快3—吉林快三服务号

    扫描关注领取更多福利