收藏 分享(赏)

c-网络应用编程第06章-udp应用编程.ppt

上传人:天天快乐 文档编号:1116363 上传时间:2018-06-13 格式:PPT 页数:50 大小:490KB
下载 相关 举报
c-网络应用编程第06章-udp应用编程.ppt_第1页
第1页 / 共50页
c-网络应用编程第06章-udp应用编程.ppt_第2页
第2页 / 共50页
c-网络应用编程第06章-udp应用编程.ppt_第3页
第3页 / 共50页
c-网络应用编程第06章-udp应用编程.ppt_第4页
第4页 / 共50页
c-网络应用编程第06章-udp应用编程.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

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可靠性不如TCP5UDP不像TCP那样能保证有序传输,6.1 UDP与TCP的区别(续),UDP速度比TCP快由于UDP不需要先与对方建立连接,也不需要传输确认,因此其数据传输速度比TCP快得多。UDP有消息边界使用UDP不需要考虑消息边界问题,使用上比TCP简单UDP可以一对多传输利用UDP可以使用广播或组播的方式同时向子网上的所有客户发送信息。这一点也比TCP方便。,6.1 UDP与TCP的区别(续),UDP可靠性

3、不如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 UdpClient类,UdpClient类提供了

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

5、ew 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 UdpClient(iep);注意:如果创建的UdpClient对象主要用于接

7、收远程主机向本机指定端口发送来的数据报,使用这种方式比较合适。这是因为端口号是固定的,只要远程主机知道本机的域名或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 udpClient = new UdpClient();/指定默认远程主机和端口号udpCli

9、ent.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 同步发送和接收数据,编写基于UDP的应用程序时,关键在于如何实现数据的发送和接收。由于UDP不需

10、要建立连接,因此可以在任何时候直接向网络中的任意主机发送UDP数据。在同步阻塞方式下,可以使用UdpClient对象的Send方法和Receive方法。 Send:可直接将数据发送到远程主机,并返回发送数据的长度,Send方法发送数据的类型为byte数组。Receive:能够在指定的本地IP地址和端口上接收数据,该方法带一个引用类型的IPEndPoint实例,并将接收到的数据作为byte数组返回。,6.2.2 同步发送和接收数据(续),发送数据:(1)udpClient.Send (Byte, Int32) Byte:指定发送的数据Int32:发送数据的数据长度说明:这种重载形式假定UDP客户

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

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

13、 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, 发送失败);,发送方法示例,6.2.2 同步发送和接收数据(续),UdpClient对象的Receive方法用于获取从从远程主机发送的 UDP数据

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

15、dpClient udpClient = new UdpClient(Dns.GetHostAddresses(Dns.GetHostName()0, 18001);IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);try Byte receiveBytes = udpClient.Receive(ref remoteIpEndPoint); string receiveData = Encoding.Unicode.GetString(receiveBytes); Console.WriteLine(接收到信息:+r

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

17、 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 ac, Object obj),6.2.3 异步发送和接收数据,(3)假定在调用Send方法之前已经建立了远程主机。同步:Send(byte data, in

18、t length) 异步:BeginSend (byte data, int length, AsyncCallback ac, Object obj)对于每个BeginSend方法,在除了与同步Send方法有相同的参数外,每个方法又增加了两个参数,一个是AsyncCallback类型的委托,用于指定异步操作完成时调用的方法。如果不采用回调机制,而是采用轮询机制,可以将其设置为null;另一个是Object类型的对象,用于将状态信息传递给回调方法,当不使用回调方法时,此值设置为null即可。,6.2.3 异步发送和接收数据,【例6-2】 利用UdpClient的异步方法,编写一个网络聊天程序,

19、程序运行效果如图6-2所示。,6.3 利用UDP进行广播和组播,6.3.1 广播和组播的基本概念6.3.2 加入和退出组播组6.3.3 利用广播和组播实现群发功能,6.3.1 广播和组播的基本概念,TCP通信采用一对一的通信模式。日常生活中的网络会议通知、广告、网络信息公告等功能,需要采用UDP实现一对多的群发功能。通过Internet实现群发功能的形式有两种:(1)利用广播向子网中的所有客户发送消息,比如各类通知、单位公告、集体活动日程安排等;(2)利用组播向Internet网上不同的子网发送消息,比如集团向其所属的公司或用户子网发布信息公告等。,6.3.1 广播和组播的基本概念,广播:就是

20、指同时向子网中的多台计算机发送消息,并且所有子网中的计算机都可以接收到发送方发来的消息。每个广播消息包含一个特殊的IP地址,这个特殊地址的特点是子网内主机标示部分的二进制表示均为1。广播消息地址分为两种类型:本地广播:本地广播是指向子网中的所有计算机发送广播消息,其他网络不会受到本地广播的影响。 全球广播:目的地是网络上的所有设备。,利用广播实现群发,6.3.1 广播和组播的基本概念,本地广播:IP地址分为两部分,网络标示部分(指定向哪个子网发送)和主机标示部分(全为1表示向该子网内的所有用户发送消息。),把主机标示部分二进制表示全部为1的地址称为本地广播地址 全球广播: 全球广播使用四个字节

21、所有位全为1的IP地址,即点分十进制的255.255.255.255,这个特定的广播地址表明数据报的目的地是网络上的所有设备。但是由于路由器会自动过滤掉全球广播,所以使用这个地址没有实际意义。 IPAddress.BroderCast 255.255.255.255,例1:对于B类网络192.168.0.0,使用子网掩码255.255.0.0。本地广播地址应为:,利用广播实现群发,6.3.1 广播和组播的基本概念,答:本地广播地址是192.168.255.255.,例2:对于B类网络192.168.100.0,使用子网掩码255.255.255.0。本地广播地址应为:,答:本地广播地址是192

22、.168.100.255.,6.3.1 广播和组播的基本概念,组播和广播的区别:(1)本地广播无法通过路由器,广播只是限于本网段内,遇到路由器则止。同网段内其他在指定端口侦听的程序都能收到该包都需要一个数据copy。组播没有这个限制,只要加入组就能收到数据包。(2)由于广播是向某个子网中的所有计算机用户发送消息,没有目的性,会增加网络传输负担,而且资源消耗较高。组播将消息发送到加入指定组播组的计算机中,组播组是开放的,每台计算机都可以通过程序随时加入到组播组中,也可以随时离开,因此减少了不必要的网络传输负担。,6.3.2 加入和退出组播组,组播组:是分享一个组播地址的一组设备。任何发送到组播地

23、址的消息都会被发送到组内的所有成员设备上。组可以是永久的,也可以是临时的。大多数组播组是临时的,仅在有成员的时候才存在。组播地址:组播地址是范围在224.0.0.0到239.255.255.255的D类IP地址。 IP组播使用特殊的IP地址范围来表示不同的组播组。用户创建一个新的组播组时只需从地址范围内选出一个地址,然后为这个地址构造一个对象,就可以开始发送消息了。,6.3.2 加入和退出组播组,加入组播组在UdpClient类中,使用JoinMulticastGroup方法将UdpClient对象和TTL一起加入组播组,使用DropMulticastGroup退出组播组。例如:/创建UdpC

24、lient的实例并设置使用的本地端口号UdpClient udpClient=new UdpClient(8001);udpClient.JoinMulticastGroup(IPAddress.Parse(224.100.0.1); 或者:UdpClient udpClient=new UdpClient(8001);udpClient.JoinMulticastGroup(IPAddress.Parse(224.100.0.1), 50); 其中50为TTL值。,6.3.2 加入和退出组播组,生存周期:TTL 使用组播时,应注意的是TTL(Time To Live,生存周期)值的设置。TT

25、L值是允许路由器转发的最大数目,当达到这个最大值时,数据包就会被丢弃。如果使用默认值(默认值为1),则只能在子网中发送。可以通过UdpClient对象的Ttl属性直接设置TTL值,例如:UdpClient myUdpClient = new UdpClient();myUdpClient. TTL = 50; 该语句设置TTL值为50,即最多允许50次路由器转发。,6.3.2 加入和退出组播组,2退出多路广播组利用UdpClient的DropMulticastGroup方法,可以退出组播组。参数中指出要退出的多路广播组的IPAddress实例。UdpClient从组中收回之后,将不能再接收发送

26、到该组的数据报。例如:udpClient.DropMulticastGroup(IPAddress.Parse(224.100.0.1);,6.3.3 利用广播和组播实现群发功能,【例7-3】编写一个Windows应用程序,向子网发送广播信息,同时接收子网中的任意主机发送的广播信息,程序设计界面如图7-3所示。图7-3 例7-3的设计界面,6.3.3 利用广播和组播实现群发功能,利用组播实现群发功能1、广播的通信模式虽然能够实现一对多的通信需要,但是,由于广播是向子网中的所有计算机用户发送消息,没有目的性,不但增加了网络传输负担,而且资源消耗较高。2、组播也叫多路广播。所谓组播是将消息从一台计

27、算机发送到本网或全网内选择的计算机子集上,即发送到那些加入指定组播组的计算机上。,6.3.3 利用广播和组播实现群发功能,2利用组播实现群发功能udpClient = new UdpClient(port);IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); 替换为: udpClient = new UdpClient(port);udpClient.JoinMulticastGroup(IPAddress.Parse(224.0.0.1);udpClient.Ttl = 50;IPEndPoint remote = new IPEndP

28、oint(IPAddress.Any, 0);,6.3.3 利用广播和组播实现群发功能,2利用组播实现群发功能(续) 并将buttonSend_Click中的IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, port);udpClient.Send(bytes, bytes.Length, iep);替换为: IPEndPoint iep = new IPEndPoint(IPAddress.Parse(224.0.0.1), port);udpClient.Send(bytes, bytes.Length, iep);,6.4 利用UD

29、P编写网络会议程序,利用组播技术进行网络会议讨论网络中的任何人都可以加入讨论所有发言者发送的信息都发送到会议讨论组讨论组中的每个人都可以看到任何人发送的信息,6.4 利用UDP编写网络会议程序,6.4 利用UDP编写网络会议程序,进入会议室:随时接收发送到会议的所有信息,将登录用户的IP:Port 添加入“会议室成员”在ListBox中提示:新用户IP:Port登录 发送信息:则与会人员:在ListBox中提示:用户IP:Port说:* 离开会议室:不再接收发送到会议的信息,与会人员:在ListBox中移除该用户,6.4 利用UDP编写网络会议程序,实现分析:进入会议室:加入组播组,创建接收信

30、息线程,不断接收到发送到组播组的信息。向组播组发送 Login,【昵称】信息发送信息: 向组播组发送:Message,说话内容离开会议室: 退出组播组,关闭UdpClient对象, 向组播组发送:Logout,6.4 利用UDP编写网络会议程序,1Login命令格式:Login含义:用户请求进入会议室。用户单击【进入会议室】按钮时,向组播组发送Login消息。所有接收方收到Login消息之后,一方面在“相关信息”中提示有新用户进入会议室,另一方面将向发送方发送List消息告知本机信息了解到的人员列表信息。2List命令格式:List,用户列表信息含义:接收方收到List消息之后,将收到的非重复

31、用户信息添加到“会议室现有成员”中。,6.4 利用UDP编写网络会议程序,3Logout命令格式:Logout含义:用户请求退出网络会议室。接收方收到Logout消息之后,提示用户离开会议室,并将该用户从人员列表中删除。4Message命令格式:Message,发言信息含义:表示与会人员发出的谈话内容。当用户在文本框中输入发言信息并单击回车键后,向组播组所有成员发送Message消息。接收方接收到发言信息后,直接将收到的信息显示出来。,本章作业及实验,作业 习题1、习题2、习题3、习题4、习题5实验 实验三(网络呼叫应答与提醒),实验三 网络呼叫应答提醒系统,实验目的 (1)练习UDP应用编程

32、的方法。 (2)练习动画窗体的设计方法。 (3)练习自动显示和隐藏窗体的方法。 (4)通过实验步骤学习系统托盘的设计方法。,实验三 网络呼叫应答提醒系统,开发一个简单的基于UDP的网络呼叫应答及时提醒系统。程序运行时,系统自动弹出一个逐渐变大的动画窗体,同时在任务栏内显示一个托盘图标。窗体变化到最大程度后的界面效果如图1-1所示,实验三 网络呼叫应答提醒系统,用户关闭窗体后,窗体消失,但并不结束程序运行。关闭窗体后,如果用户双击任务栏内的托盘图标,系统仍然会自动弹出与启动程序时效果相同的逐渐变大的动画窗体。系统弹出快捷菜单后,如果用户选择【呼叫对方】命令,程序自动弹出动画窗体,并向接收方发出自己的呼叫信息;如果用户选择【退出程序】命令,则结束整个系统的运行。程序运行时,系统自动创建一个线程在端口8001监听网络呼叫信息,当接收到某人呼叫时,弹出一个对话框,提示呼叫方发送的信息。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报