c#网络应用编程第06章 UDP应用编程.ppt_第1页
c#网络应用编程第06章 UDP应用编程.ppt_第2页
c#网络应用编程第06章 UDP应用编程.ppt_第3页
c#网络应用编程第06章 UDP应用编程.ppt_第4页
c#网络应用编程第06章 UDP应用编程.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 UDP应用编程,6.1 UDP基础知识 6.2 UDP应用编程技术 6.3 利用UDP协议进行广播和组播,本章教学目的学习UDP基础知识 ,利用UdpClient类完成单播、组播和广播。 本章教学要求 (1)掌握UDP协议同TCP协议相比的优缺点。 (2)掌握组播和广播的概念 (3)掌握UdpClient实现单播发送数据和接收数据的方法。 (4)掌握UdpClient类实现组播及广播通信的方法。 教学难点和重点 UDP协议同TCP协议相比的优缺点,利用UdpClient类完成单播、组播和广播。,本章重点,6.1 UDP与TCP的区别,UDP(User Datagram Protocol

2、,用户数据报协议)是一个简单的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务。 UDP与TCP相比主要有以下区别。 1UDP速度比TCP快 2UDP有消息边界 3UDP可以一对多传输 4UDP可靠性不如TCP 5UDP不像TCP那样能保证有序传输,6.1 UDP与TCP的区别(续),UDP速度比TCP快 由于UDP不需要先与对方建立连接,也不需要传输确认,因此其数据传输速度比TCP快得多。 UDP有消息边界 使用UDP不需要考虑消息边界问题,使用上比TCP简单 UDP可以一对多传输 利用UDP可以使用广播或组播的方式同时向子网上的所有客户发送信息。这一点也比TCP方便。,6.1 U

3、DP与TCP的区别(续),UDP可靠性不如TCP 与TCP不同,UDP并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP称为不可靠的传输协议。 UDP不像TCP那样能保证有序传输 UDP不能确保数据的发送和接收顺序。对于突发性的数据报,有可能会乱序。事实上,UDP的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。,6.1 UDP与TCP的区别(续),6.2 UDP应用编程技术,6.2.1 UdpClient类 6.2.2 同步发送和接收数据 6.2.3 异步发送和接收数据,6.2.1 U

4、dpClient类,UdpClient类提供了发送和接收无连接的UDP数据报的方便的方法。封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了UDP应用编程的难度。 与TCP协议有TcpListener类和TcpClient类不同,UDP协议只有UdpClient类,这是因为UDP协议是无连接的协议,所以只需要一种Socket。,6.2.1 UdpClient类(续),位于System.Net.Sockets命名空间下 构造函数有四种重载形式。编写客户端程序时,常用形式为:UdpClient UdpClient=new UdpClient(“”, 51888) 它

5、相当于:UdpClient udpClient=new UdpClient();udpClient.Connect(, 51888); 思考:UDP的Connect和TCP的Connect有什么不同?,6.2.1 UdpClient类(续),(1)public UdpClient(int port) 自动分配合适的本地IPv4地址,并将基础socket与指定的本地端口号绑定。例如: UdpClient udpClient = new UdpClient(51666); 如果仅仅是为了发送数据报,而且接收方又能接收任何远程端口发送给它的数据报,在这种情况下,可以将本地端口号指定为0,表示让系统自

6、动为其分配一个合适的端口号。由于这种形式不需要我们考虑指定的端口号是否会产生冲突,因此这是创建UdpClient对象最方便的方式。,6.2.1 UdpClient类(续),(2)public UdpClient(IPEndPoint localEp) 与包含本地IP地址和端口号的IPEndPoint实例绑定。 例如: IPAddress address = Dns.GetHostAddresses(Dns.GetHostName()0; IPEndPoint iep = new IPEndPoint(address, 51666); UdpClient udpClient =new UdpCl

7、ient(iep); 注意:如果创建的UdpClient对象主要用于接收远程主机向本机指定端口发送来的数据报,使用这种方式比较合适。这是因为端口号是固定的,只要远程主机知道本机的域名或IP地址,它就可以直接向本机的指定端口发送数据报。,6.2.1 UdpClient类(续),(3)public UdpClient(string hostname, int port) 自动分配合适的本地IP地址和端口号,用于收发数据,并使用hostname和port参数建立默认远程主机。例如: UdpClient udpClient = new UdpClient(, 11000); 适用于向默认远程主机发数据

8、,或者只接收默认远程主机发来的数据,而其他主机发送来的数据报自动丢弃的场合。 使用这种构造函数,调用UdpClient对象的Send方法发送数据报时,不能在Send参数中再指定远程主机,否则会引发异常。当需要改变发送目标时,可以调用Connect方法重新建立新的默认远程主机。,6.2.1 UdpClient类(续),(4)public UdpClient() 自动分配合适的本地IPv4地址和端口号,但是该构造函数不执行套接字绑定。如果使用这种构造函数,在发送数据报之前,必须先调用Connect方法,且只能将数据报发送到Connect方法建立的远程主机。例如: UdpClient udpClie

9、nt = new UdpClient(); /指定默认远程主机和端口号 udpClient.Connect(, 51666); Byte sendBytes = Encoding.Unicode.GetBytes(你好!); /发送给默认远程主机 udpClient.Send(sendBytes, sendBytes.Length); 注意:由于这种构造函数不执行套接字绑定,因此如果希望加入多路广播组,不要使用这种构造函数。,6.2.1 UdpClient类(续),UdpClient类的常用方法和属性,6.2.1 UdpClient类(续),UdpClient类的常用方法属性,6.2.2 同步

10、发送和接收数据,编写基于UDP的应用程序时,关键在于如何实现数据的发送和接收。由于UDP不需要建立连接,因此可以在任何时候直接向网络中的任意主机发送UDP数据。在同步阻塞方式下,可以使用UdpClient对象的Send方法和Receive方法。 Send:可直接将数据发送到远程主机,并返回发送数据的长度,Send方法发送数据的类型为byte数组。 Receive:能够在指定的本地IP地址和端口上接收数据,该方法带一个引用类型的IPEndPoint实例,并将接收到的数据作为byte数组返回。,6.2.2 同步发送和接收数据(续),发送数据: (1)udpClient.Send (Byte, In

11、t32) Byte:指定发送的数据 Int32:发送数据的数据长度 说明:这种重载形式假定UDP客户端已经通过Connect方法指定了默认的远程主机,或者在实例化UdpClient时已经指定了远程服务器的IP和端口,UdpClient.Send (Byte, Int32, IPEndPoint) 将 UDP数据报发送到位于指定远程终结点的主机。 Byte:待发送到远程主机的数据 Int32: 待发送到远程主机的数据长度 IPEndPoint :远程主机端点,包含了应用程序连接到主 机上的服务所需的IP地址和端口信息。 说明:使用这种方法时,通过将IPEndPoint的Address属性指 定为

12、SocketOptionName.Broadcast,可将数据报发送到默认 广播地址55。,6.2.2 同步发送和接收数据(续),6.2.2 同步发送和接收数据(续),UdpClient.Send(Byte,Int32, String, Int32)将UDP数据报发送到指定的远程主机上的指定端口。 Byte:待发送到远程主机的数据 Int32:待发送到远程主机的数据长度 String:远程主机名 Int32: 端口 说明:使用这种方法时,不能用Connect建立默认远程主机,否则将引发异常。另外,如果将hostname参数值指定为 “55”,

13、可将数据报发送到默认广播地址,6.2.2 同步发送和接收数据(续),UdpClient myUdpClient = new UdpClient(); try IPEndPoint iep = new IPEndPoint(remoteIp, port); byte bytes = System.Text.Encoding.Unicode.GetBytes(textBox1.Text); myUdpClient.Send(bytes, bytes.Length, iep); catch (Exception err) MessageBox.Show(err.Message, 发送失败); ,发送

14、方法示例,6.2.2 同步发送和接收数据(续),UdpClient对象的Receive方法用于获取从从远程主机发送的 UDP数据报。语法形式如下: public byte Receive(ref IPEndPoint remoteEP) IPEndPoint参数:表示发送方的IP地址和端口号 返回值:为接收到的字节数组。 注意:利用此方法既可以接收指定远程主机的数据报,也可以接收所有远程主机的数据报。 如接收所有远程主机发的数据报,可用下面的代码创建: IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); IPAddre

15、ss.Any表示对方的IP地址可以是任何IP地址 0表示对方的端口号可以是任何端口号。,6.2.2 同步发送和接收数据(续),接收数据示例: UdpClient udpClient = new UdpClient(Dns.GetHostAddresses(Dns.GetHostName()0, 18001); IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); try Byte receiveBytes = udpClient.Receive(ref remoteIpEndPoint); string receiveD

16、ata = Encoding.Unicode.GetString(receiveBytes); Console.WriteLine(接收到信息:+receiveData); catch(Exception e ) MessageBox.Show (e.ToString(); ,6.2.2 同步发送和接收数据(续),【例6-1】利用UdpClient,编写一个网络聊天工具,程序运行效果如图7-1所示。,6.2.3 异步发送和接收数据,1发送数据 对于UdpClient对象的每个同步方法,都有与之对应的异步BeginSend和EndSend方法。 (1)利用IPEndPoint实例指定远程主机信息

17、。 同步:Send(byte data, int length, IPEndPoint iep) 异步:BeginSend (byte data, int length, IPEndPoint iep, AsyncCallback ac, Object obj) (2)直接指定远程主机的主机名及端口号。 同步:Send(byte data, int length, string remoteHostName, int port) 异步:BeginSend(byte data, int length, string remoteHostName, int port, AsyncCallback

18、ac, Object obj),6.2.3 异步发送和接收数据,(3)假定在调用Send方法之前已经建立了远程主机。 同步:Send(byte data, int length) 异步:BeginSend (byte data, int length, AsyncCallback ac, Object obj) 对于每个BeginSend方法,在除了与同步Send方法有相同的参数外,每个方法又增加了两个参数,一个是AsyncCallback类型的委托,用于指定异步操作完成时调用的方法。 如果不采用回调机制,而是采用轮询机制,可以将其设置为null;另一个是Object类型的对象,用于将状态信息

19、传递给回调方法,当不使用回调方法时,此值设置为null即可。,6.2.3 异步发送和接收数据,【例6-2】 利用UdpClient的异步方法,编写一个网络聊天程序,程序运行效果如图6-2所示。,6.3 利用UDP进行广播和组播,6.3.1 广播和组播的基本概念 6.3.2 加入和退出组播组 6.3.3 利用广播和组播实现群发功能,6.3.1 广播和组播的基本概念,TCP通信采用一对一的通信模式。日常生活中的网络会议通知、广告、网络信息公告等功能,需要采用UDP实现一对多的群发功能。 通过Internet实现群发功能的形式有两种: (1)利用广播向子网中的所有客户发送消息,比如各类通知、单位公告

20、、集体活动日程安排等; (2)利用组播向Internet网上不同的子网发送消息,比如集团向其所属的公司或用户子网发布信息公告等。,6.3.1 广播和组播的基本概念,广播:就是指同时向子网中的多台计算机发送消息,并且所有子网中的计算机都可以接收到发送方发来的消息。每个广播消息包含一个特殊的IP地址,这个特殊地址的特点是子网内主机标示部分的二进制表示均为1。 广播消息地址分为两种类型: 本地广播:本地广播是指向子网中的所有计算机发送广播消息,其他网络不会受到本地广播的影响。 全球广播:目的地是网络上的所有设备。,利用广播实现群发,6.3.1 广播和组播的基本概念,本地广播:IP地址分为两部分,网络

21、标示部分(指定向哪个子网发送)和主机标示部分(全为1表示向该子网内的所有用户发送消息。),把主机标示部分二进制表示全部为1的地址称为本地广播地址 全球广播: 全球广播使用四个字节所有位全为1的IP地址,即点分十进制的55,这个特定的广播地址表明数据报的目的地是网络上的所有设备。但是由于路由器会自动过滤掉全球广播,所以使用这个地址没有实际意义。 IPAddress.BroderCast 55,例1:对于B类网络,使用子网掩码。本地广播地址应为:,利用广播实现群发,6.3.1 广播和组播的基本概念,答:

22、本地广播地址是55.,例2:对于B类网络,使用子网掩码。本地广播地址应为:,答:本地广播地址是55.,6.3.1 广播和组播的基本概念,组播和广播的区别: (1)本地广播无法通过路由器,广播只是限于本网段内,遇到路由器则止。同网段内其他在指定端口侦听的程序都能收到该包都需要一个数据copy。组播没有这个限制,只要加入组就能收到数据包。 (2)由于广播是向某个子网中的所有计算机用户发送消息,没有目的性,会增加网络传输负担,而且资源消耗较高。组播将消息发送到加入指定组播组的计算机中,组播组是开放

23、的,每台计算机都可以通过程序随时加入到组播组中,也可以随时离开,因此减少了不必要的网络传输负担。,6.3.2 加入和退出组播组,组播组:是分享一个组播地址的一组设备。任何发送到组播地址的消息都会被发送到组内的所有成员设备上。 组可以是永久的,也可以是临时的。大多数组播组是临时的,仅在有成员的时候才存在。 组播地址:组播地址是范围在到55的D类IP地址。 IP组播使用特殊的IP地址范围来表示不同的组播组。 用户创建一个新的组播组时只需从地址范围内选出一个地址,然后为这个地址构造一个对象,就可以开始发送消息了。,6.3.2 加入和退出组播组,加入组播组

24、在UdpClient类中,使用JoinMulticastGroup方法将UdpClient对象和TTL一起加入组播组,使用DropMulticastGroup退出组播组。例如: /创建UdpClient的实例并设置使用的本地端口号 UdpClient udpClient=new UdpClient(8001); udpClient.JoinMulticastGroup(IPAddress.Parse(); 或者: UdpClient udpClient=new UdpClient(8001); udpClient.JoinMulticastGroup(IPAddress.

25、Parse(), 50); 其中50为TTL值。,6.3.2 加入和退出组播组,生存周期:TTL 使用组播时,应注意的是TTL(Time To Live,生存周期)值 的设置。TTL值是允许路由器转发的最大数目,当达到这个 最大值时,数据包就会被丢弃。如果使用默认值(默认值为 1),则只能在子网中发送。可以通过UdpClient对象的Ttl属 性直接设置TTL值,例如: UdpClient myUdpClient = new UdpClient(); myUdpClient. TTL = 50; 该语句设置TTL值为50,即最多允许50次路由器转发。,6.3.2 加入和退

26、出组播组,2退出多路广播组 利用UdpClient的DropMulticastGroup方法,可以退出组播组。参数中指出要退出的多路广播组的IPAddress实例。 UdpClient从组中收回之后,将不能再接收发送到该组的数据报。 例如: udpClient.DropMulticastGroup(IPAddress.Parse();,6.3.3 利用广播和组播实现群发功能,【例7-3】编写一个Windows应用程序,向子网发送广播信息,同时接收子网中的任意主机发送的广播信息,程序设计界面如图7-3所示。 图7-3 例7-3的设计界面,6.3.3 利用广播和组播实现群发功

27、能,利用组播实现群发功能 1、广播的通信模式虽然能够实现一对多的通信需要,但是,由于广播是向子网中的所有计算机用户发送消息,没有目的性,不但增加了网络传输负担,而且资源消耗较高。 2、组播也叫多路广播。所谓组播是将消息从一台计算机发送到本网或全网内选择的计算机子集上,即发送到那些加入指定组播组的计算机上。,6.3.3 利用广播和组播实现群发功能,2利用组播实现群发功能 udpClient = new UdpClient(port); IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); 替换为: udpClient = new UdpCli

28、ent(port); udpClient.JoinMulticastGroup(IPAddress.Parse(); udpClient.Ttl = 50; IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);,6.3.3 利用广播和组播实现群发功能,2利用组播实现群发功能(续) 并将buttonSend_Click中的 IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, port); udpClient.Send(bytes, bytes.Length, iep);

29、替换为: IPEndPoint iep = new IPEndPoint(IPAddress.Parse(), port); udpClient.Send(bytes, bytes.Length, iep);,6.4 利用UDP编写网络会议程序,利用组播技术进行网络会议 讨论网络中的任何人都可以加入讨论 所有发言者发送的信息都发送到会议讨论组 讨论组中的每个人都可以看到任何人发送的信息,6.4 利用UDP编写网络会议程序,6.4 利用UDP编写网络会议程序,进入会议室:随时接收发送到会议的所有信息, 将登录用户的IP:Port 添加入“会议室成员” 在ListBox中提示:新用户IP:Port登录 发送信息:则与会人员: 在ListBox中提示:用户IP:Port说:* 离开会议室:不再接收发送到会议的信息,与会人员: 在ListBox中移除该用户,6.4 利用UDP编写网络会议程序,实现分析: 进入会议室: 加入组播组,创建接收信息线程,不断接收到发送到组播组的信息。 向组播组发送 L

温馨提示

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

最新文档

评论

0/150

提交评论