实验七UDPSocket一.本实验目的及要求:1.掌握在TCP/IP体系结构中UDP协议概念和应用领域;学习UDP协议内容,了解单播、广播和组播的概念,掌握什么是D类IP地址及分类;2.掌握在JAVA程序设计中与UDP通信相关的类DatagramSocket和DatagramPacket;3.掌握在JAVA程序设计中利用UDP进行组播的类MulticastSocket。4.完成以下各内容程序,截存运行结果图,并提交实验报告。二.基础知识1.UDP概念UDP(UserDatagramProtocol)用户数据报协议(RFC768)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。在实际的Internet应用中,UDP占据了半壁江山。UDP常用应用和相关设置端口,如表4-1所示。表4-1UDP常用应用和相关设置端口2.UDP套接字类在JAVA语言中,一个UDPSocket用于处理数据包的发送或接收业务。每一个数据包独立的选择路由进行发送和接收。在两台计算机之间的多个数据包发送会选择不同的路径,并且到达顺序也不同于发送顺序。在JAVA语言中,DatagramSocket类被用于发送和接收UDP数据包,定义如图4-2所示。例如:DatagramSockets=newDatagramSocket(null);s.bind(newInetSocketAddress(8888));该语句相当于:DatagramSockets=newDatagramSocket(8888);这两种情况都在本地创建一个DatagramSocket接收UDP端口8888的数据。其构造方法:DatagramSocket()在本地端口创建创建一个数据包套接字。DatagramSocket(intport)在本地指定端口创建创建一个数据包套接字。DatagramSocket(intport,InetAddressladdr)在本地指定的IP地址和端口创建创建一个数据包套接字。DatagramPacket该类用于存储数据包,UDP数据包用于实现无连接的数据提交服务。每个信息利用自己包中的信息独立完成在计算机之间的传递。在2台计算机之间传递的多个数据包可能选择不同的路由,并且到达顺序不同于发送顺序。数据包的提交是不可靠的。DatagramPacket(byte[]buf,intlength)建立一个指定缓冲长度的数据包;DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)在指定的IP地址和端口上,建立一个指定缓冲长度的数据包。3.组播组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。多播套接字类MulticastSocket这个类用于发送和接收IP多播数据包。该MulticastSocket是一个UDPDatagramSocket,增加了在internet上加入其它多播主机“组”的功能。UDP广播发送建立在DatagramSocket基础上。用于接收广播数据必须绑定在统配的地址上。一个多播组是建立在一个D类IP地址上和一个UDP端口上。D类IP地址的范围是224.0.0.0----239.255.255.255,注意地址224.0.0.0是保留地址不能使用。在某些实现中,广播数据包可以绑定在多个指定的地址上。一个终端需要加入一个组播组需要在指定的端口上建立一个MulticastSocket//加入组播组,并在组内发送问候...Stringmsg=Hello;InetAddressgroup=InetAddress.getByName(228.5.6.7);MulticastSockets=newMulticastSocket(8000);s.joinGroup(group);DatagramPackethi=newDatagramPacket(msg.getBytes(),msg.length(),group,8000);s.send(hi);//获得反馈消息byte[]buf=newbyte[1000];DatagramPacketrecv=newDatagramPacket(buf,buf.length);s.receive(recv);...//离开多播组s.leaveGroup(group);三.类及方法:1.DatagramSocket常用方法InetAddressgetAddress()获得发送或接收到数据包的IPbyte[]getData()获得数据intgetLength()获得发送或接收的数据长度intgetPort()获得发送或接收的数据来对方的端口号SocketAddressgetSocketAddress()获得发送或接收数据的Socket地址voidsetAddress(InetAddressiaddr)设置发送数据的目的地址voidsetData(byte[]buf)设置发送的数据voidsetData(byte[]buf,intoffset,intlength)设置发送的数据voidsetLength(intlength)设置数据包长度voidsetPort(intiport)设置数据包的端口号voidsetSocketAddress(SocketAddressaddress)设置数据包的Socket2.DatagramPacket常用方法voidbind(SocketAddressaddr)绑定数据包到指定的Socketvoidclose()关闭该UDPSocketvoidconnect(InetAddressaddress,intport)连接远端地址voidconnect(SocketAddressaddr)连接远端地址voiddisconnect()断开连接booleangetBroadcast()测试能否广播InetAddressgetInetAddress()获得已连接的IP地址InetAddressgetLocalAddress()获得本地的IP地址intgetLocalPort()获得本地的端口号SocketAddressgetLocalSocketAddress()获得本地的Socket地址.intgetPort()获得指定数据包的端口号SocketAddressgetRemoteSocketAddress()获得远端的Socket地址.intgetSoTimeout()获得数据包超时时间booleanisBound()获得绑定Socket的状态booleanisClosed()获得Socket是否关闭booleanisConnected()获得Socket是否连接voidreceive(DatagramPacketp)接收数据包voidsend(DatagramPacketp)发送数据包voidsetBroadcast(booleanon)开启/关闭广播voidsetReceiveBufferSize(intsize)设置接收缓存voidsetSendBufferSize(intsize)设置发送缓存voidsetSoTimeout(inttimeout)设置超时时间,毫秒级3)MulticastPacket常用方法booleangetLoopbackMode()获得本地环回测试模式intgetTimeToLive()获得数据包生命时间voidjoinGroup(InetAddressmcastaddr)加入组播组voidleaveGroup(InetAddressmcastaddr)离开组播组voidsetLoopbackMode(booleandisable)设置本地环回测试voidsetTimeToLive(intttl)设置数据包生命时间四.知识填空1.在应用层上HTTP协议使用传输层(TCP)协议;应用层DNS协议使用传输层(UDP)协议;应用层FTP协议使用传输层(TCP)协议;应用层IGMP协议使用传输层(UDP)。2.信息传播的方式有(单播)、(多播)和(组播)。3.在JAVA语言中,.net类库包中有关于UDP通信的类,包括(DatagramSocket),(DatagramPacket)和(MulticastSocket)。4.DatagramSocket类中的发送数据包的方法是(publicvoidsend(DatagramPacketsp)throwsIOException),接收数据包的方法是(publicsynchronizedvoidreceive(DatagramPacketrp)throwsIOException)。5.DatagramPacket类中从数据报中获得字节数据的方法是(publicsynchronizedgetData()),设置数据报的方法是(设置数据报的数据:publicsynchronizedsetData(bytebuf[]),设置数据报的长度:publicsynchronizedsetLength(intlength))。6.IPv4地址,通常由2个部分组成,分别是:网络号和主机号,广播地址是(主机号)全为1,如果主机号全为0,则该IP地址表示(该主机所在的网络地址)。7.IP组播利用(D)类IP地址,在Java语言中有(MulticastSocket)类用于定义组播对象,加入组播组的方法是(publicvoidjoinGroup(InetAddressmulticastAddress)throwsIOException),离开组播组的方法是(publicvoidleaveGroup(InetAddressmulticastAddress)throwsIOException)。五.程序填空1.在本地建议一个UDP客户端importjava.io.*;importjava.net.*;//引用网络类库classexp_6_1a{publicstaticvoidmain(String[]args){DatagramSocketds=null;try{ds=newDatagramSocket();//UDP客户端套接字构造方法System.out.println(ds.getLocalAddress());System.out.println(ds.getLocalPort());}catch(Exceptione){System.err.println(e.getMessage());}}}2.实现一个UDP客户端的数据接收和发送importjava.io.*;//引入IO类库importjava.net.*;//引入网络类库classexp_6_2implementsRunnable{DatagramSocketds=null;//新建一个DatagramSocket实例DatagramPacketp=null;InetAddressaddress=null;intport=0;byte[]buf=newby