资源预览内容
第1页 / 共50页
第2页 / 共50页
第3页 / 共50页
第4页 / 共50页
第5页 / 共50页
第6页 / 共50页
第7页 / 共50页
第8页 / 共50页
第9页 / 共50页
第10页 / 共50页
亲,该文档总共50页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第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,用户数据报协议)是一个简单的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务。 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 UDP与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 UdpClient类,UdpClient类提供了发送和接收无连接的UDP数据报的方便的方法。封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了UDP应用编程的难度。 与TCP协议有TcpListener类和TcpClient类不同,UDP协议只有UdpClient类,这是因为UDP协议是无连接的协议,所以只需要一种Socket。,6.2.1 UdpClient类(续),位于System.Net.Sockets命名空间下 构造函数有四种重载形式。编写客户端程序时,常用形式为: UdpClient UdpClient=new UdpClient(“www.abcd.com”, 51888) 它相当于: UdpClient udpClient=new UdpClient(); udpClient.Connect(“www.abcd.com“, 51888); 思考:UDP的Connect和TCP的Connect有什么不同?,6.2.1 UdpClient类(续),(1)public UdpClient(int port) 自动分配合适的本地IPv4地址,并将基础socket与指定的本地端口号绑定。例如: UdpClient udpClient = new UdpClient(51666); 如果仅仅是为了发送数据报,而且接收方又能接收任何远程端口发送给它的数据报,在这种情况下,可以将本地端口号指定为0,表示让系统自动为其分配一个合适的端口号。由于这种形式不需要我们考虑指定的端口号是否会产生冲突,因此这是创建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对象主要用于接收远程主机向本机指定端口发送来的数据报,使用这种方式比较合适。这是因为端口号是固定的,只要远程主机知道本机的域名或IP地址,它就可以直接向本机的指定端口发送数据报。,6.2.1 UdpClient类(续),(3)public UdpClient(string hostname, int port) 自动分配合适的本地IP地址和端口号,用于收发数据,并使用hostname和port参数建立默认远程主机。例如: UdpClient udpClient = new UdpClient(“www.contoso.com“, 11000); 适用于向默认远程主机发数据,或者只接收默认远程主机发来的数据,而其他主机发送来的数据报自动丢弃的场合。 使用这种构造函数,调用UdpClient对象的Send方法发送数据报时,不能在Send参数中再指定远程主机,否则会引发异常。当需要改变发送目标时,可以调用Connect方法重新建立新的默认远程主机。,6.2.1 UdpClient类(续),(4)public UdpClient() 自动分配合适的本地IPv4地址和端口号,但是该构造函数不执行套接字绑定。如果使用这种构造函数,在发送数据报之前,必须先调用Connect方法,且只能将数据报发送到Connect方法建立的远程主机。例如: UdpClient udpClient = new UdpClient(); /指定默认远程主机和端口号 udpClient.Connect(“www.contoso.com“, 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不需要建立连接,因此可以在任何时候直接向网络中的任意主机发送UDP数据。在同步阻塞方式下,可以使用UdpClient对象的Send方法和Receive方法。 Send:可直接将数据发送到远程主机,并返回发送数据的长度,Send方法发送数据的类型为byte数组。 Receive:能够在指定的本地IP地址和端口上接收数据,该方法带一个引用类型的IPEndPoint实例,并将接收到的数据作为byte数组返回。,6.2.2 同步发送和接收数据(续),发送数据: (1)udpClient.Send (Byte, Int32) Byte:指定发送的数据 Int32:发送数据的数据长度 说明:这种重载形式假定UDP客户端已经通过Connect方法指定了默认的远程主机,或者在实例化UdpClient时已经指定了远程服务器的IP和端口,UdpClient.Send (Byte, Int32, IPEndPoint) 将 UDP数据报发送到位于指定远程终结点的主机。 Byte:待发送到远程主机的数据 Int32: 待发送到远程主机的数据长度 IPEndPoint :远程主机端点,包含了应用程序连接到主 机上的服务所需的IP地址和端口信息。 说明:使用这种方法时,通过将IPEndPoint的Address属性指 定为SocketOptionName.Broadcast,可将数据报发送到默认 广播地址255.255.255.255。,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 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数据报。语法形式如下: public byte Receive(ref IPEndPoint remoteEP) IPEndPoint参数:表示发送方的IP地址和端口号 返回值:为接收到的字节数组。 注意:利用此方法既可以接收指定远程主机的数据报,也可以接收所有远程主机的数据报。 如接收所有远程主机发的数据报,可用下面的代码创建: IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); IPAddress.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 receiveData = 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实例指定远程主机信息。 同步:Send(byte data, int length, IPEndPoint iep) 异步:BeginSend (byte data, int
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号