您好,欢迎访问三七文档
1第6章UDP应用编程6.1UDP基础知识6.2UDP应用编程技术6.3利用UDP协议进行广播和组播2本章教学目的学习UDP基础知识,利用UdpClient类完成单播、组播和广播。本章教学要求(1)掌握UDP协议同TCP协议相比的优缺点。(2)掌握组播和广播的概念(3)掌握UdpClient实现单播发送数据和接收数据的方法。(4)掌握UdpClient类实现组播及广播通信的方法。教学难点和重点UDP协议同TCP协议相比的优缺点,利用UdpClient类完成单播、组播和广播。本章重点36.1UDP与TCP的区别UDP(UserDatagramProtocol,用户数据报协议)是一个简单的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务。UDP与TCP相比主要有以下区别。1.UDP速度比TCP快2.UDP有消息边界3.UDP可以一对多传输4.UDP可靠性不如TCP5.UDP不像TCP那样能保证有序传输46.1UDP与TCP的区别(续)UDP速度比TCP快由于UDP不需要先与对方建立连接,也不需要传输确认,因此其数据传输速度比TCP快得多。UDP有消息边界使用UDP不需要考虑消息边界问题,使用上比TCP简单UDP可以一对多传输利用UDP可以使用广播或组播的方式同时向子网上的所有客户发送信息。这一点也比TCP方便。56.1UDP与TCP的区别(续)UDP可靠性不如TCP与TCP不同,UDP并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP称为不可靠的传输协议。UDP不像TCP那样能保证有序传输UDP不能确保数据的发送和接收顺序。对于突发性的数据报,有可能会乱序。事实上,UDP的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。66.1UDP与TCP的区别(续)UDPTCP连接无连接面向连接速度无需建立连接,速度较快需要建立连接,速度较慢目的主机一对一,一对多仅能一对一带宽UDP报头较短,消耗带宽更少消耗更多的带宽消息边界有无可靠性低高顺序无序有序76.2UDP应用编程技术6.2.1UdpClient类6.2.2同步发送和接收数据6.2.3异步发送和接收数据86.2.1UdpClient类UdpClient类提供了发送和接收无连接的UDP数据报的方便的方法。封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了UDP应用编程的难度。与TCP协议有TcpListener类和TcpClient类不同,UDP协议只有UdpClient类,这是因为UDP协议是无连接的协议,所以只需要一种Socket。96.2.1UdpClient类(续)位于System.Net.Sockets命名空间下构造函数有四种重载形式。编写客户端程序时,常用形式为:UdpClientUdpClient=newUdpClient(“”,51888)它相当于:UdpClientudpClient=newUdpClient();udpClient.Connect();思考:UDP的Connect和TCP的Connect有什么不同?106.2.1UdpClient类(续)(1)publicUdpClient(intport)自动分配合适的本地IPv4地址,并将基础socket与指定的本地端口号绑定。例如:UdpClientudpClient=newUdpClient(51666);如果仅仅是为了发送数据报,而且接收方又能接收任何远程端口发送给它的数据报,在这种情况下,可以将本地端口号指定为0,表示让系统自动为其分配一个合适的端口号。由于这种形式不需要我们考虑指定的端口号是否会产生冲突,因此这是创建UdpClient对象最方便的方式。116.2.1UdpClient类(续)(2)publicUdpClient(IPEndPointlocalEp)与包含本地IP地址和端口号的IPEndPoint实例绑定。例如:IPAddressaddress=Dns.GetHostAddresses(Dns.GetHostName())[0];IPEndPointiep=newIPEndPoint(address,51666);UdpClientudpClient=newUdpClient(iep);注意:如果创建的UdpClient对象主要用于接收远程主机向本机指定端口发送来的数据报,使用这种方式比较合适。这是因为端口号是固定的,只要远程主机知道本机的域名或IP地址,它就可以直接向本机的指定端口发送数据报。126.2.1UdpClient类(续)(3)publicUdpClient(stringhostname,intport)自动分配合适的本地IP地址和端口号,用于收发数据,并使用hostname和port参数建立默认远程主机。例如:UdpClientudpClient=newUdpClient();适用于向默认远程主机发数据,或者只接收默认远程主机发来的数据,而其他主机发送来的数据报自动丢弃的场合。使用这种构造函数,调用UdpClient对象的Send方法发送数据报时,不能在Send参数中再指定远程主机,否则会引发异常。当需要改变发送目标时,可以调用Connect方法重新建立新的默认远程主机。136.2.1UdpClient类(续)(4)publicUdpClient()自动分配合适的本地IPv4地址和端口号,但是该构造函数不执行套接字绑定。如果使用这种构造函数,在发送数据报之前,必须先调用Connect方法,且只能将数据报发送到Connect方法建立的远程主机。例如:UdpClientudpClient=newUdpClient();//指定默认远程主机和端口号udpClient.Connect();Byte[]sendBytes=Encoding.Unicode.GetBytes(你好!);//发送给默认远程主机udpClient.Send(sendBytes,sendBytes.Length);注意:由于这种构造函数不执行套接字绑定,因此如果希望加入多路广播组,不要使用这种构造函数。146.2.1UdpClient类(续)Connect方法建立默认远程主机。因为UDP是无连接的,所以不会阻止调用该方法的线程。另外,如果打算接收多路广播数据报,不要调用Connect方法,否则从指定的默认地址以外的地址到达的任何数据报都将被丢弃。但是,如果在调用Send方法时指定了IPAddress.Broadcast,则可以将数据广播到默认的广播地址255.255.255.255Send方法发送数据报Receive方法接收数据报BeginSend方法开始从连接的socket中异步发送数据报BeginReceive方法开始从连接的socket中异步接收数据报UdpClient类的常用方法和属性156.2.1UdpClient类(续)EndSend方法结束挂起的异步发送数据报EndReceive方法结束挂起的异步接受数据报JoinMulticastGroup方法将UdpClient添加到多路广播组DropMulticastGroup方法将UdpClient退出多路广播组Close方法关闭Active属性获取或者设置一个值指示是否已建立默认远程主机Available属性获取或设置缓冲器中可用数据报的数量Client属性获取或设置基础网络套接字EnableBroadcast属性是否接收或发送广播UdpClient类的常用方法属性166.2.2同步发送和接收数据编写基于UDP的应用程序时,关键在于如何实现数据的发送和接收。由于UDP不需要建立连接,因此可以在任何时候直接向网络中的任意主机发送UDP数据。在同步阻塞方式下,可以使用UdpClient对象的Send方法和Receive方法。Send:可直接将数据发送到远程主机,并返回发送数据的长度,Send方法发送数据的类型为byte数组。Receive:能够在指定的本地IP地址和端口上接收数据,该方法带一个引用类型的IPEndPoint实例,并将接收到的数据作为byte数组返回。176.2.2同步发送和接收数据(续)发送数据:(1)udpClient.Send(Byte[],Int32)Byte[]:指定发送的数据Int32:发送数据的数据长度说明:这种重载形式假定UDP客户端已经通过Connect方法指定了默认的远程主机,或者在实例化UdpClient时已经指定了远程服务器的IP和端口18UdpClient.Send(Byte[],Int32,IPEndPoint)将UDP数据报发送到位于指定远程终结点的主机。Byte[]:待发送到远程主机的数据Int32:待发送到远程主机的数据长度IPEndPoint:远程主机端点,包含了应用程序连接到主机上的服务所需的IP地址和端口信息。说明:使用这种方法时,通过将IPEndPoint的Address属性指定为SocketOptionName.Broadcast,可将数据报发送到默认广播地址255.255.255.255。6.2.2同步发送和接收数据(续)196.2.2同步发送和接收数据(续)UdpClient.Send(Byte[],Int32,String,Int32)将UDP数据报发送到指定的远程主机上的指定端口。Byte[]:待发送到远程主机的数据Int32:待发送到远程主机的数据长度String:远程主机名Int32:端口说明:使用这种方法时,不能用Connect建立默认远程主机,否则将引发异常。另外,如果将hostname参数值指定为“255.255.255.255”,可将数据报发送到默认广播地址206.2.2同步发送和接收数据(续)UdpClientmyUdpClient=newUdpClient();try{IPEndPointiep=newIPEndPoint(remoteIp,port);byte[]bytes=System.Text.Encoding.Unicode.GetBytes(textBox1.Text);myUdpClient.Send(bytes,bytes.Length,iep);}catch(Exceptionerr){MessageBox.Show(err.Message,发送失败);}发送方法示例216.2.2同步发送和接收数据(续)UdpClient对象的Receive方法用于获取从从远程主机发送的UDP数据报。语法形式如下:publicbyte[]Receive(refIPEndPointremoteEP)IPEndPoint参数:表示发送方的IP地址和端口号返回值:为接收到的字节数组。注意:利用此方法既可以接收指定远程主机的数据报,也可以接收所有远程主机的数据报。如接收所有远程主机发的数据报,可用下面的代码创建:IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);IPAddress.Any表示对方的IP地址可以是任何IP地址0表示对方的端口号可以是任何端口号。226.2.2同步发送和接收数据(续)接收数据示例:UdpClientudpClient=newUdpClient(Dns.GetHostAddresses(Dns.GetHostName())[0],18001);IPEndPointremoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);try{Byte[]receiveBytes=udpClient.Receive(refremoteIpEndPoint);stringreceiveData=E
本文标题:UDP应用编程
链接地址:https://www.777doc.com/doc-2864358 .html