资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1 1第第4 4章章 UDPUDP应用编程应用编程 4.1 4.1 UDPUDP基础知识基础知识4.2 UDP4.2 UDP应用编程技术应用编程技术4.3 4.3 利用利用UDPUDP协议进行广播和组播协议进行广播和组播2 24 4.1 .1 UDPUDP基础知识基础知识UDP(UserUDP(User Datagram Protocol) Datagram Protocol)全称是用户数据报协议。是一个简单全称是用户数据报协议。是一个简单的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务。与与TCPTCP相比,相比,UDPUDP有如下一些特点:有如下一些特点:u优点优点(1)UDP(1)UDP基于无连接的协议,速度比基于无连接的协议,速度比TCPTCP更快。对于强调传输性能而不更快。对于强调传输性能而不是传输完整性的应用(例如音频和多媒体应用),是传输完整性的应用(例如音频和多媒体应用),UDPUDP是最好的选择;是最好的选择;(2)UDP(2)UDP不但支持一对一连接,而且也支持一对多连接,可以使用广播不但支持一对一连接,而且也支持一对多连接,可以使用广播的方式多地址发送,而的方式多地址发送,而TCPTCP仅支持一对一的通信;仅支持一对一的通信;(3)UDP(3)UDP与与TCPTCP的报头比是的报头比是8 8:2020,这使得,这使得UDPUDP消耗的网络带宽更少消耗的网络带宽更少(4)UDP(4)UDP传输的数据有消息边界,而传输的数据有消息边界,而TCPTCP没有消息边界。没有消息边界。 3 34 4.1 .1 UDPUDP基础知识基础知识缺点缺点(1) (1) UDPUDP缺乏双方的握手信号,因此发送方无法了解数据报是缺乏双方的握手信号,因此发送方无法了解数据报是否已经到达目标主机。如果在从发送方到接收方的传递过程否已经到达目标主机。如果在从发送方到接收方的传递过程中出现了数据中出现了数据包包丢失,协议本身并不能做出任何检测或提示,丢失,协议本身并不能做出任何检测或提示,因此因此可靠性可靠性不如不如TCPTCP。(2) UDP(2) UDP没有任何对双方会话的支持,当接收多个数据报时,没有任何对双方会话的支持,当接收多个数据报时,不能保证各数据包到达的顺序与发出的顺序相同不能保证各数据包到达的顺序与发出的顺序相同。当然,。当然,UDPUDP的这种乱序性基本上很少出现,通常只会在网络非常拥挤的的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才可能发生。情况下才可能发生。 UDPUDP与与TCPTCP的共同点的共同点都是都是构建于底层构建于底层IPIP之上的传输层协议之上的传输层协议4 44 4.1 .1 UDPUDP基础知识基础知识UDPTCP连接连接无连接无连接面向连接面向连接速度速度无需建立连接,速度无需建立连接,速度较快较快需要建立连接,速度较慢需要建立连接,速度较慢目的主机目的主机一对一,一对多一对一,一对多仅能一对一仅能一对一带宽带宽UDP报头较短,消耗报头较短,消耗带宽更少带宽更少消耗更多的带宽消耗更多的带宽消息边界消息边界有有无无可靠性可靠性低低高高顺序顺序无序无序有序有序5 54 4.2 .2 UDPUDP应用编程技术应用编程技术 4.2.1 4.2.1 UdpClientUdpClient类类 4.2.2 4.2.2 发送和接收数据的方法发送和接收数据的方法6 64.2.1 4.2.1 UdpClientUdpClient类类UdpClientUdpClient类提供了发送和接收无连接的类提供了发送和接收无连接的UDPUDP数据报的方便的数据报的方便的方法。封装了底层的套接字,并分别提供了对套接字进一步方法。封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了封装后的同步和异步操作的方法,降低了UDPUDP应用编程的难度。应用编程的难度。与与TCPTCP协议有协议有TcpListenerTcpListener类和类和TcpClientTcpClient类不同,类不同,UDPUDP协议只协议只有有UdpClientUdpClient类,这是因为类,这是因为UDPUDP协议是无连接的协议,所以只协议是无连接的协议,所以只需要一种需要一种SocketSocket。7 74.2.1 4.2.1 UdpClientUdpClient类(续)类(续)位于位于System.Net.SocketsSystem.Net.Sockets命名空间下命名空间下构造函数有四种重载形式(见教材构造函数有四种重载形式(见教材P94P94)。编写客户端程序)。编写客户端程序时,常用形式为:时,常用形式为:UdpClientUdpClient UdpClientUdpClient=new =new UdpClient(“www.abcd.comUdpClient(“www.abcd.com”, ”, 51888) 51888) 它相当于:它相当于:UdpClientUdpClient udpClientudpClient=new =new UdpClientUdpClient();();udpClient.Connect(www.abcd.comudpClient.Connect(www.abcd.com, 51888);, 51888);思考:思考:UDPUDP的的ConnectConnect和和TCPTCP的的ConnectConnect有什么不同?有什么不同?8 84.2.1 4.2.1 UdpClientUdpClient类(续)类(续)Send()发发送数据送数据报报Receive()接收数据接收数据报报BeginSend()开始从开始从连连接的接的socketsocket中异步中异步发发送数据送数据报报BeginReceive()开始从开始从连连接的接的socketsocket中异步接收数据中异步接收数据报报EndSend()结结束挂起的异步束挂起的异步发发送数据送数据报报EndReceive()结结束挂起的异步接受数据束挂起的异步接受数据报报JoinMulticastGroup()将将UdpClientUdpClient添加到多路广播添加到多路广播组组DropMulticastGroup()将将UdpClientUdpClient退出多路广播退出多路广播组组Close()关关闭闭Dispose()释放资源释放资源UdpClientUdpClient类的常用方法类的常用方法9 94.2.1 4.2.1 UdpClientUdpClient类(续)类(续)Active获取或者设置一个值指示是否已建立默认远程主机Available获取或设置缓冲器中可用数据报的数量Client获取或设置基础网络套接字 EnableBroadcast是否接收或发送广播ExclusiveAddressUse是否允许一个客户端使用指定端口UdpClientUdpClient类的常用属性类的常用属性10104.2.2 4.2.2 发送和接收数据的方法发送和接收数据的方法编写基于编写基于UDPUDP的应用程序时,关键在于如何实现数据的发送的应用程序时,关键在于如何实现数据的发送和接收。由于和接收。由于UDPUDP不需要建立连接,因此可以在任何时候直不需要建立连接,因此可以在任何时候直接向网络中的任意主机发送接向网络中的任意主机发送UDPUDP数据。在同步阻塞方式下,数据。在同步阻塞方式下,可以使用可以使用UdpClientUdpClient对象的对象的SendSend方法和方法和ReceiveReceive方法。方法。 SendSend:可直接将数据发送到远程主机,并可直接将数据发送到远程主机,并返回发送数据的返回发送数据的长度,长度,SendSend方法发送数据的类型为方法发送数据的类型为bytebyte数组。数组。ReceiveReceive:能够在指定的本地能够在指定的本地IPIP地址和端口上接收数据,该地址和端口上接收数据,该方法方法带一个引用类型的带一个引用类型的IPEndPointIPEndPoint实例实例,并将接收到的数并将接收到的数据作为据作为bytebyte数组数组返回。返回。 11114.2.2 4.2.2 发送和接收数据的方法发送和接收数据的方法( (续续) )u udpClient.SenddpClient.Send (Byte, Int32) (Byte, Int32) 将将UDPUDP数据报发送到远数据报发送到远程主机。程主机。ByteByte:指定发送的数据指定发送的数据Int32Int32:发送数据的数据长度发送数据的数据长度说明:说明: 这种重载形式假定这种重载形式假定UDPUDP客户端已经通过客户端已经通过ConnectConnect方法指定方法指定了默认的远程主机,或者在实例化了默认的远程主机,或者在实例化UdpClientUdpClient时已经指定了时已经指定了远程服务器的远程服务器的IPIP和端口和端口12124.2.2 4.2.2 发送和接收数据的方法发送和接收数据的方法( (续续) )UdpClient.SendUdpClient.Send (Byte, Int32, (Byte, Int32, IPEndPointIPEndPoint) ) 将将 UDPUDP数数据报发送到位于指定远程终结点的主机据报发送到位于指定远程终结点的主机. .ByteByte:待发送到远程主机的数据:待发送到远程主机的数据Int32: Int32: 待发送到远程主机的数据长度待发送到远程主机的数据长度IPEndPointIPEndPoint :远程主机端点,包含了应用程序连接到:远程主机端点,包含了应用程序连接到主机上的服务所需的主机上的服务所需的IPIP地址和端口信息。地址和端口信息。 说明:说明:这种重载形式在参数中指定了远程主机的端点,在这种重载形式在参数中指定了远程主机的端点,在调用该方法前不需要指定远程主机的信息,如(调用该方法前不需要指定远程主机的信息,如(不需要通不需要通过过ConnectConnect方法指定远程主机端点,不需要在实例化方法指定远程主机端点,不需要在实例化UdpClientUdpClient时指定远程服务器的时指定远程服务器的IPIP和端口和端口)13134.2.2 4.2.2 发送和接收数据的方法发送和接收数据的方法( (续续) )UdpClient.Send(UdpClient.Send(Byte,Int32, String, Int32)Byte,Int32, String, Int32)将将UDP数数据报发送到指定的远程主机上的指定端口。据报发送到指定的远程主机上的指定端口。ByteByte:待发送到远程主机的数据待发送到远程主机的数据Int32Int32:待发送到远程主机的数据长度待发送到远程主机的数据长度StringString:远程主机名远程主机名Int32: Int32: 端口端口说明:说明:这种重载形式在参数中指定了远程主机的端点,在调这种重载形式在参数中指定了远程主机的端点,在调用该方法前不需要指定远程主机的信息,如(用该方法前不需要指定远程主机的信息,如(不需要通过不需要通过ConnectConnect方法指定远程主机端点,不需要在实例化方法指定远程主机端点,不需要在实例化UdpClientUdpClient时指定远程服务器的时指定远程服务器的IPIP和端口和端口)14144.2.2 4.2.2 发送和接收数据的方法发送和接收数据的方法( (续续) )UdpClientUdpClient myUdpClientmyUdpClient = new = new UdpClientUdpClient();();trytry IPEndPointIPEndPoint iepiep = new = new IPEndPoint(remoteIpIPEndPoint(remoteIp, port);, port); byte bytes = byte bytes = System.Text.Encoding.Unicode.GetBytes(textBox1.Text);System.Text.Encoding.Unicode.GetBytes(textBox1.Text); myUdpClient.Send(bytesmyUdpClient.Send(bytes, , bytes.Lengthbytes.Length, , iepiep);); catch (Exception err) catch (Exception err) MessageBox.Show(err.MessageMessageBox.Show(err.Message, , 发送失败发送失败);); 发送方法示例发送方法示例15154.2.2 4.2.2 发送和接收数据的方法发送和接收数据的方法( (续续) )接收方法示例接收方法示例(书上有错书上有错):):UdpClientUdpClient udpClientudpClient = new UdpClient(51666); = new UdpClient(51666);IPEndPointIPEndPoint remoteIpEndPointremoteIpEndPoint = new = new IPEndPoint(IPAddress.AnyIPEndPoint(IPAddress.Any, 0);, 0);Try Try Byte Byte receiveBytesreceiveBytes = = udpClient.Receive(udpClient.Receive(refref remoteIpEndPointremoteIpEndPoint);); string string receiveDatareceiveData = = System.Text.Encoding.Unicode.GetString(receiveBytesSystem.Text.Encoding.Unicode.GetString(receiveBytes);); Console.WriteLineConsole.WriteLine(接收到信息:接收到信息:+receiveDatareceiveData);); catch(Exceptioncatch(Exception e ) e ) MessageBox.ShowMessageBox.Show ( (e.ToStringe.ToString(); (); 16164.2.3 UDP4.2.3 UDP网络聊天程序网络聊天程序( (续续) )设计界面设计界面17174.2.3 UDP4.2.3 UDP网络聊天程序网络聊天程序( (续续) )运行效果运行效果18184 4.3 .3 利用利用UDPUDP进行广播和组播进行广播和组播4.2.1 4.2.1 通过通过InternetInternet实现群发功能实现群发功能 4.3.2 4.3.2 在在InternetInternet上举行网络会议上举行网络会议19194.3.1 通过Internet实现群发功能 TCPTCP通信采用一对一的通信模式。日常生活中的通信采用一对一的通信模式。日常生活中的网络会议通网络会议通知、广告、网络信息公告等功能,需要采用知、广告、网络信息公告等功能,需要采用UDPUDP实现一对多的实现一对多的群发功能。群发功能。通过通过InternetInternet实现群发功能的形式有两种:实现群发功能的形式有两种:(1)(1)利用利用广播广播向子网中的所有客户发送消息,比如各类通知、向子网中的所有客户发送消息,比如各类通知、单位公告、集体活动日程安排等;单位公告、集体活动日程安排等;(2)(2)利用利用组播组播向向InternetInternet网上不同的子网发送消息,比如集团网上不同的子网发送消息,比如集团向其所属的公司或用户子网发布信息公告等。向其所属的公司或用户子网发布信息公告等。 20204.3.1 通过Internet实现群发功能广播广播:就是指同时向子网中的多台计算机发送消息,并且就是指同时向子网中的多台计算机发送消息,并且所有子网中的计所有子网中的计算机算机都可以接收到发送方发来的消息。每个广播消息包含一个特殊的都可以接收到发送方发来的消息。每个广播消息包含一个特殊的IPIP地地址,这个特殊地址的特点是子网内主机标示部分的二进制表示均为址,这个特殊地址的特点是子网内主机标示部分的二进制表示均为1 1。广播消息地址分为两种类型:广播消息地址分为两种类型:本地广播本地广播: :本地广播是指向子网中的所有计算机发送广播消息,其他网络本地广播是指向子网中的所有计算机发送广播消息,其他网络不会受到本地广播的影响。不会受到本地广播的影响。IPIP地址分为两部分,网络标示部分(地址分为两部分,网络标示部分(指定向哪个子网发送指定向哪个子网发送)和主机标示)和主机标示部分(部分(全为全为1 1表示向该子网内的所有用户发送消息。表示向该子网内的所有用户发送消息。),这两部分是靠),这两部分是靠子网掩码来区分的,我们把主机标示部分二进制表示全部为子网掩码来区分的,我们把主机标示部分二进制表示全部为1 1的地址称为的地址称为本地广播地址。本地广播地址。全球广播全球广播: : 全球广播使用四个字节所有位全为全球广播使用四个字节所有位全为1 1的的IPIP地址,即点分十进制的地址,即点分十进制的255.255.255.255255.255.255.255,这个特定的广播地址表明数据报的目的地是网络上的,这个特定的广播地址表明数据报的目的地是网络上的所有设备。但是由于路由器会自动过滤掉全球广播,所以使用这个地址没所有设备。但是由于路由器会自动过滤掉全球广播,所以使用这个地址没有实际意义。有实际意义。利用广播实现群发利用广播实现群发2121例例1 1:对于对于B B类网络类网络192.168.0.0192.168.0.0,使用子网掩码,使用子网掩码255.255.0.0255.255.0.0。本地广播地址应为:。本地广播地址应为: 利用广播实现群发利用广播实现群发4.3.1 通过Internet实现群发功能 答:答:本地广播地址是本地广播地址是192.168.255.255.192.168.255.255. 例例2 2:对于对于B B类网络类网络192.168.100.0192.168.100.0,使用子网掩码,使用子网掩码255.255.255.0255.255.255.0。本地广播地址应为:。本地广播地址应为: 答:答:本地广播地址是本地广播地址是192.168.100.255.192.168.100.255. 22224.3.1 通过Internet实现群发功能UdpClient myUdpClient = new UdpClient();UdpClient myUdpClient = new UdpClient();trytry /让其自动提供子网中的让其自动提供子网中的IPIP广播地址广播地址 IPEndPoint iep = new IPEndPoint(IPEndPoint iep = new IPEndPoint(IPAddress.BroadcastIPAddress.Broadcast, 8001);, 8001); /允许发送和接收广播数据报允许发送和接收广播数据报 myUdpClient.EnableBroadcast = true;myUdpClient.EnableBroadcast = true; / /将发送内容转换为字节数组将发送内容转换为字节数组 byte bytes = System.Text.Encoding.UTF8.GetBytes(textBox1.Text);byte bytes = System.Text.Encoding.UTF8.GetBytes(textBox1.Text); / /向子网发送信息向子网发送信息 myUdpClient.Send(bytes, bytes.Length, iep);myUdpClient.Send(bytes, bytes.Length, iep); catch (Exception err)catch (Exception err) MessageBox.Show(err.Message, MessageBox.Show(err.Message, 发送失败发送失败);); finallyfinallymyUdpClient.Close(); myUdpClient.Close(); 广播发送数据方法广播发送数据方法23234.3.1 通过Internet实现群发功能利用利用广播广播技术向子网发送广播信息,同时接收子网中的任技术向子网发送广播信息,同时接收子网中的任意主机发送的广播信息。意主机发送的广播信息。设计界面(具体代码见教材设计界面(具体代码见教材P99P99的源程序)的源程序)24244.3.1 通过Internet实现群发功能利用组播实现群发功能利用组播实现群发功能1 1、广播的通信模式虽然能够实现一对多的通信需要,但是,、广播的通信模式虽然能够实现一对多的通信需要,但是,由于广播是向子网中的所有计算机用户发送消息,没有目由于广播是向子网中的所有计算机用户发送消息,没有目的性,不但增加了网络传输负担,而且资源消耗较高。的性,不但增加了网络传输负担,而且资源消耗较高。2 2、组播组播也叫多路广播。所谓组播是将消息从一台计算机发也叫多路广播。所谓组播是将消息从一台计算机发送到送到本网或全网内选择的计算机子集本网或全网内选择的计算机子集上,即发送到那些加上,即发送到那些加入指定组播组的计算机上。入指定组播组的计算机上。25254.3.1 通过Internet实现群发功能组播组:组播组:是分享一个组播地址的一组设备。任何发送到组是分享一个组播地址的一组设备。任何发送到组播地址的消息都会被发送到组内的所有成员设备上。组可播地址的消息都会被发送到组内的所有成员设备上。组可以是永久的,也可以是临时的。大多数组播组是临时的,以是永久的,也可以是临时的。大多数组播组是临时的,仅在有成员的时候才存在。仅在有成员的时候才存在。组播地址:组播地址:组播地址是范围在组播地址是范围在224.0.0.0224.0.0.0到到239.255.255.255239.255.255.255的的D D类类IPIP地址。地址。 IPIP组播使用特殊的组播使用特殊的IPIP地址地址范围来表示不同的组播组。范围来表示不同的组播组。用户创建一个新的组播组时只需从地址范围内选出一个地用户创建一个新的组播组时只需从地址范围内选出一个地址,然后为这个地址构造一个对象,就可以开始发送消息址,然后为这个地址构造一个对象,就可以开始发送消息了。了。 26264.3.1 通过Internet实现群发功能加入组播组加入组播组在在UdpClientUdpClient类中,使用类中,使用JoinMulticastGroupJoinMulticastGroup方法将方法将UdpClientUdpClient对象和对象和TTLTTL一起加入组播组,使用一起加入组播组,使用DropMulticastGroupDropMulticastGroup退出组播组。例如:退出组播组。例如:/创建创建UdpClientUdpClient的实例并设置使用的本地端口号的实例并设置使用的本地端口号UdpClientUdpClient udpClientudpClient=new UdpClient(8001);=new UdpClient(8001);udpClient.JoinMulticastGroup(IPAddress.Parse(224.100.0.1);udpClient.JoinMulticastGroup(IPAddress.Parse(224.100.0.1); 或者:或者:UdpClientUdpClient udpClientudpClient=new UdpClient(8001);=new UdpClient(8001);udpClient.JoinMulticastGroup(IPAddress.Parse(224.100.0.1), udpClient.JoinMulticastGroup(IPAddress.Parse(224.100.0.1), 50);50); 其中其中5050为为TTLTTL值。值。27274.3.1 通过Internet实现群发功能使用组播时,应注意的是使用组播时,应注意的是TTL(TimeTTL(Time To Live To Live,生存周期,生存周期) )值值的设置。的设置。TTLTTL值是允许路由器转发的最大数目,当达到这个值是允许路由器转发的最大数目,当达到这个最大值时,数据包就会被丢弃。如果使用默认值最大值时,数据包就会被丢弃。如果使用默认值( (默认值为默认值为1)1),则只能在子网中发送。可以通过,则只能在子网中发送。可以通过UdpClientUdpClient对象的对象的TtlTtl属性直接设置属性直接设置TTLTTL值,例如:值,例如:UdpClientUdpClient myUdpClientmyUdpClient = new = new UdpClientUdpClient();();myUdpClientmyUdpClient. TTL = 50;. TTL = 50; 该语句设置该语句设置TTLTTL值为值为5050,即最多允许,即最多允许5050次路由器转发。次路由器转发。 28284.3.1 通过Internet实现群发功能组播发送数据方法示例组播发送数据方法示例29294.3.1 通过Internet实现群发功能组播和广播的区别:组播和广播的区别:(1 1)本地广播无法通过路由器)本地广播无法通过路由器, ,广播只是限于本网段内,广播只是限于本网段内,遇到路由器则止。同网段内其他在指定端口侦听的程序都遇到路由器则止。同网段内其他在指定端口侦听的程序都能收到该包都需要一个数据能收到该包都需要一个数据copycopy。组播没有这个限制,只。组播没有这个限制,只要加入组就能收到数据包。要加入组就能收到数据包。(2 2)由于广播是向某个子网中的所有计算机用户发送消息,)由于广播是向某个子网中的所有计算机用户发送消息,没有目的性,会增加网络传输负担,而且资源消耗较高。没有目的性,会增加网络传输负担,而且资源消耗较高。组播将消息发送到加入指定组播组的计算机中,组播组是组播将消息发送到加入指定组播组的计算机中,组播组是开放的,每台计算机都可以通过程序随时加入到组播组中,开放的,每台计算机都可以通过程序随时加入到组播组中,也可以随时离开,因此减少了不必要的网络传输负担。也可以随时离开,因此减少了不必要的网络传输负担。30304.3.1 通过Internet实现群发功能利用组播技术向子网发送组播信息,同时接收组播信息。利用组播技术向子网发送组播信息,同时接收组播信息。设计界面(具体代码见教材设计界面(具体代码见教材P103P103的源程序)的源程序)31314.3.2 在Internet上举行网络会议 利用组播技术进行网络会议讨论(参见教材利用组播技术进行网络会议讨论(参见教材P106P106)u网络中的任何人都可以加入讨论网络中的任何人都可以加入讨论u所有发言者发送的信息都发送到会议讨论组所有发言者发送的信息都发送到会议讨论组u讨论组中的每个人都可以看到任何人发送的信息讨论组中的每个人都可以看到任何人发送的信息3232本章作业及实验本章作业及实验作业作业1 1、2 2(与上一章一块交)(与上一章一块交)实验实验(1 1)做实验三(网络呼叫应答与提醒)做实验三(网络呼叫应答与提醒)(2 2)继续设计型实验)继续设计型实验
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号