版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章UDPSocket
6.1UDP6.2UDPSocket6.3IP广播6.4IP组播
6.1UDP
6.1.1UDP的概念
UDP是TCP/IP参考模型中传输层的无连接协议,提供面向事务的、简单的、不可靠的数据传送服务。UDP协议的最早规范于1980年发布,编号为RFC768。UDP与TCP均属于TCP/IP体系结构中传输层的协议,通过应用层与传输层之间的端口为上层的应用程序提供并发传输服务。虽然UDP是一种不可靠的网络协议,但是在很多情况下UDP协议会非常有用。因为UDP具有TCP所望尘莫及的数据传输速度优势。在TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,使TCP传输速度受到了严重的影响。反观UDP,由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使数据传输速度得到了保证。UDP与TCP之间的主要区别如表6-1所示。正因为UDP的特点,在为网络通信软件选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重,很多仅在局域网环境下使用的通信软件采用UDP协议。又由于UDP不属于连接型协议,具有资源消耗小、处理速度快的优点,因而通常音频、视频和消息数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如各种类型的聊天室软件,如ICQ、QQ和视频电话会议系统均使用的UDP协议。相对于数据传输的可靠性而言,某些应用更加注重实际性能,为了获得更好的使用效果(例如,更高的画面帧刷新速率),往往可以牺牲一定的可靠性(例如,画面质量)。采用UDP应用层的协议如表6-2所示。6.1.2信息传播的形式
信息在网络中传播的形式有三种,分别是:单播(UniCast)、广播(BroadCast)和组播(MultiCast,或称为多播),如图6-1所示。采用TCP作为传输协议,信息传递只能实现点到点的单播形式,如果必须使用TCP作为传输协议而实现向多个用户发送相同的消息,就必须采用轮流循环的方式进行点到点的单播,从而降低了信息的实时性也浪费了带宽。利用UDP作为传输协议,则可以实现所有形式的传播。图6-1单播、广播、组播示意图单播指客户端与服务器之间的点到点连接,即当客户端发出请求时,服务器发送独立单播流。单播的优点:服务器及时响应客户机的请求;服务器针对每个客户不同的请求发送不同的数据,容易实现个性化服务。单播的缺点:服务器针对每个客户机都需要发送数据流,服务器流量 = 客户机数量 × 客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。现有的网络带宽是金字塔结构,即城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞,只要5%的客户在全速使用网络,其他人就无法使用了,而将主干扩展20倍几乎是不可能的。广播指主机之间“一对所有”的通信模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管是否需要),由于其不用路径选择,所以其网络成本可以很低廉。广播的优点:网络设备简单,维护简单,布网成本低廉;由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。广播的缺点:无法针对每个客户的要求和时间及时提供个性化服务;网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说广播无法向众多客户提供更多样化、更加个性化的服务;广播禁止在Internet宽带网上传输,因为会产生广播风暴,造成网络阻塞。组播指主机之间“一对一组”的通信模式,也就是加入了同一个组的主机可以接收到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。组播的优点:需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载,具备广播所具备的优点;由于组播协议是根据接收者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个组播,所以其提供的服务可以非常丰富;此协议和单播协议一样允许在Internet宽带网上传输。组播的缺点:与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QoS加以弥补。现行网络虽然都支持组播的传输,但在客户认证、QoS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中。
6.2UDPSocket
6.2.1DatagramSocket类和DatagramPacket类
在J2SDK以前的版本里,TCP和UDP套接字都使用Socket类。在J2SDK中专门提供了UDP的套接字类,在类库中有DatagramSocket类和DatagramPacket类来实现对UDP数据报的传输。
DatagramSocket类用于实现UDP通信的套接字,实现端到端的通信,完成数据报的接收和发送。其特点是数据发送端和接收端不需要事先建立通信连接,甚至可以是在接收端未准备好或者不存在的情况下,发送端也可以进行消息发送,类定义如图6-2所示。图6-2DatagramSocket类定义其构造方法有:
● publicDatagramSocket(),在本地系统任一空闲的UDP端口建立UDPSocket对象;
● publicDatagramSocket(intport),在指定端口建立UDPSocket对象;
● publicDatagramSocket(intport,InetAddressaddress),在指定InetAddress对象和端口建立UDPSocket对象。
其主要方法有:
● publicvoidsend(DatagramPacketsp)throwsIOException,发送一个数据报;
● publicsynchronizedvoidreceive(DatagramPacketrp)throwsIOException,接收一个数据报;
● publicvoidclose(),关闭当前UDP套接字。代码说明如下:
①第5行声明一个DatagramSocket对象;
②第6~15行循环测试指定的UDP端口范围;
③第8行在指定的UDP端口建立一个UDP套接字,如果成功则说明该端口空闲,否则说明该端口已被占用。
运行结果如图6-3所示。
DatagramPacket类是构造一个用于接收或者发送的数据报,采用字节数组的形式存储数据,类定义如图6-4所示。图6-3扫描本地UDP端口图6-4DatagramPacket类定义其提供的构造方法:
● publicDatagramPacket(bytebuf[],intlength):该构造方法中包括了用于存储数据的字节数组和可存储的字节数,主要用于接收数据报;
● publicDatagramPacket(bytebuf[],intlength,InetAddressaddress,intport):该构造方法中包括存储数据的字节数组、可存储的字节数、接收端的地址,以及接收端的端口号,通常被用于发送数据报。其主要方法:
● publicsynchronizedgetDate():从数据报中获得数据;
● publicsynchronizedgetLength():从数据报中获得数据长度;
● publicsynchronizedsetDate(bytebuf[]):设置数据报的数据;
● publicsynchronizedsetLength(intlength):设置数据报的长度。
使用UDP实现通信,需要分别建立通信的发送端和接收端程序。
代码说明如下:
①第4行创建UDP套接字对象;
②第5行创建UDP数据报对象;
③第6行创建数据接收方的InetAddress对象;
④第7行定义数据接收方的端口号;
⑤第8行定义发送和接收缓存字节数组,容量为256B;
⑥第9~16行启动本地的UDP1080端口;
⑦第19行创建接收数据报对象,绑定接收字节数组长度为256;
⑧第20行执行receive()方法接收数据;⑨第21行通过getData()方法从收到的数据报中提取数据;
⑩第23~25行提取收到的数据报中的对方IP和端口信息;
⑪第26~27行首先通过getBytes()方法将字符串转换为字节数组,然后再构造发送数据报,在参数中指明接收方的IP和PORT,这个地址信息从第23~24行获得;
⑫第28行使用send()将数据报发送出去。
运行结果如图6-5所示。图6-5接收端运行结果在接收端首先建立接收缓存,使用定义字节数组,该数组的尺寸通常为8的整数倍,例如256,512,1024,2048等;将该字节数组带入DatagramPacket构造接收数据报;通过DatagramSocket.receive()接收数据报;利用DatagramPacket.getData()方法从数据报中提取出字节数组,并且将字节数组作为String的参数构造可读的字符串。
从运行结果中,可以得到发送端的IP地址是,使用的UDP端口是1065,接收的信息是“从发送端发送信息”。
代码注释如下:
①第11行本地开启UDP1065端口;
②第19~23行构造发送数据报,并通过send()发送该数据报;
③第25~26行构造接收数据报,并通过receive()接收数据报。
运行结果如图6-6所示。图6-6发送端运行结果在发送端首先构造发送缓存,采用字节数组,该数组尺寸同接收缓存;如果要发送字符串信息,需要使用String.getBytes()将待发送的字符串转化为字节数组;将字节数组作为DatagramPacket对象的参数构造发送数据报;通过DatagramSocket.send()方法将数据报发送出去。
从运行结果中,可以得到接收端的IP地址是,使用的UDP端口是1080,发送端得到的信息是“从接收端返回确认”。
当一个客户端同时接收和发送信息时,要注意发送和接收缓冲一定要区分开,并且在每次接收或者发送之前,要清除原有内容,否则会残留不必要的信息。6.2.2TCPSocket与UDPSocket的区别
TCP和UDP两种传输协议都在网络世界中发挥重要的作用。应用层进程根据不同网络通信的环境和特点,实际网络通信软件设计需要在UDP和TCP两种协议之间权衡。在Java中进行编程时,有以下区别:
1.消息传递的形式
TCP是面向连接的服务,只能实现点到点的传递。
UDP可以实现单播、广播和多播。在实现广播时,数据报目的地址为指定网络中最大的IP地址,例如55,具体由网络规划情况而定。在实现多播时,数据报目的地址为D类地址。
2.所使用的Socket
在TCP传输模式下,使用ServerSocket用于监听指定端口,保证实现TCP的三次握手;使用Socket建立通信的通道。
在UDP传输模式下,使用DatagramSocket直接实现传输消息的包。
3.Socket定义的位置不同
在TCP模式下,由于存在三次握手、传输、关闭等多个阶段,所以Socket定义应该为类的属性,便于在所有的方式中进行操作。
在UDP模式下,是尽最大可能交付,并不需要事先建立连接,属于单传输阶段的形式,所以在发送数据通信的类中进行定义即可,表现为在响应发送按钮事件处理和接收数据的事件处理方法中的局部变量。
4.是否存在监听及方式
在TCP模式下,存在三次握手机制,利用ServerSocket持续监听指定端口是否有连接请求到达。
在UDP模式下,直接从指定端口发送或接收数据。
5.输入/输出流的定义
在TCP模式下,由于属于管道类型的流操作,所以利用Socket.getInputStream()和Socket.getOutputStream(),分别从指定的Socket上获得输入和输出流。
在UDP模式下,按数据报文的形式进行数据通信,不存在输入/输出流。
6.发送数据的方式
在TCP模式下,首先定义输出流,在该输出流的基础上直接发送字符串:
DataOutputSrteamos=newDataOutputStream(Socket.get
OutputStream());
os.writeUTF(“Hello!”);
os.flush();
在UDP模式下,创建待发送的数据包二进制数组,打包为UDP数据包,通过send发送指定数据包:
buf=“Hello”.getBytes();
p=newDatagramPacket(buf,buf.length,address,1080);
socket.send(p);
7.接收数据的方式
在TCP模式下,首先生成输入流,然后按行的方式进行读取:
DataInputStreamin=newDataInputStream(clientSocket.getInputStream());
inputLine=in.readUTF()
在UDP模式下,首先生成接收数据的UDP缓存数组,然后利用receive方法,接收数据到指定的缓存中:
p=newDatagramPacket(buf,buf.length);
socket.receive(p);
通常,TCP协议被用于有传输可靠性要求的应用,UDP被广泛用于局域网传输和传输数据实时性要求高的应用中。
6.3IP广播
UDP允许对指定的网络发送广播消息。途径是通过将数据报发送到该网络广播地址上实现。广播地址的计算与主机上网卡配置的IP地址和网络掩码有关,如使用ifconfig.exe显示目标计算机的网卡IP配置信息如图6-7所示。图6-7网卡配置信息从图6-7中得到主机的IP地址是4,其子网掩码是,默认的出口网关是54。
对于常规的A,B,C三类IP分类方法,获得广播地址很容易。一个IP地址包括网络号和主机号两个部分,共24位。当主机地址全为“0”时表示该主机所处的网络地址,当主机地址全为“1”时表示为指定网络的广播地址。通过IP地址与网络掩码进行按位与运算,可以得到该主机所处网络号为:,则广播地址为55,如图6-8所示。图6-8IP地址与子网掩码按位与运算得到网络号当网络管理员在局域网中划分了子网时,则在A、B、C分类的基础上,将主机位数再次划分为子网号和主机号两个部分。例如:IP地址是4,而子网掩码是92,即IP地址中第四段的最高两位被用于标识子网。这时该IP地址所处的网络号为,但是广播地址是3。
如果在IP地址分配时采用了CIDR的分配方法,则网络号和广播地址的计算都需要注意。例如IP地址是4/28,标识一共使用了28位作为网络号,而剩余的4位作为主机号,则该主机所处的网络号为6,广播地址是1。
【例6-4】
使用UDP向一个广播地址发送数据。该例与例6-3的唯一差别在于所使用的目标地址为网络地址,而例6-3中的目标地址为主机地址。
代码注释如下:第19行构造目标计算机所在的网络地址(55)的InetAddress对象。这时接收客户端就可以同时接收单播信息和本网络中的广播信息,如图6-9所示。图6-9接收端同时接收单播和广播信息通用的广播地址是55。在选择广播地址时,首先要根据所提供的子网掩码判断该IP地址是采用哪一种的IP划分方式,否则就可能计算广播地址错误,导致将数据报发送给了错误的网络。
6.4IP组播
6.4.1组播的概念
TCP协议属于面向连接的点到点通信,在服务器同时连接多个客户端时,需要采用消息循环发送的形式,不仅增加了消息的延迟,而且还浪费了网络带宽。而UDP不仅可以实现消息的单播和广播,还可以实现消息的组播。
IP组播(IPmulticasting)技术,也称多址广播或多播,是一种允许一台或多台主机作为多播源,发送单一数据包到多台主机的TCP/IP网络技术。多播作为一点对多点的通信,是节省网络带宽的有效方法之一。IP组播是对硬件组播的抽象,是对标准IP网络层协议的扩展。它通过使用特定的IP组播地址,按照最大投递的原则,将IP数据报传输到一个组播群组(Multicast
Group)的主机集合。在网络音频/视频广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。目前,IP多播技术被广泛应用在网络音频/视频广播、音频点播/视频点播(AudioOnDemand/VideoOnDemand,AOD/VOD)、网络视频会议、多媒体远程教育、“PUSH”技术(如股票行情等)和虚拟现实游戏等方面。要实现IP多播通信,要求介于多播源和接收者之间的路由器、集线器、交换机以及主机均需支持IP多播。目前,IP多播技术已得到硬件、软件厂商的广泛支持。
(1)要求主机支持IP多播通信的平台包括Windows95以后的版本、Linux/Unix、Mactoshi等操作系统,运行这些操作系统的主机都可以进行IP多播通信。此外,新生产的网卡也几乎都提供了对IP多播的支持。
(2)目前大多数集线器、交换机只是简单地把多播数据当成广播来发送接收,但一些中高档交换机提供了对IP多播的支持。例如,在3COMSuperStack3Swith3300交换机上可启用802.1p或IGMP多播过滤功能,只为已侦测到IGMP数据报的端口转发多播数据报。
(3)多播通信要求多播源节点和目的节点之间的所有路由器必须提供对Internet组管理协议(InternetGroupManagementProtocol,IGMP)、多播路由协议(如PIM,DVMRP等)的支持。
由于得到硬件的支持,加入到一个多播组的主机,可以处于同一个局域网中,也可以是城域网或者广域网中支持相同体系结构的任一台主机。使用同一个IP多播地址接收多播数据报的所有主机构成了一个主机组,称为多播组,如图6-10所示。图6-10多播组当一台主机欲加入某个多播组时,会发出“主机成员报告”的IGMP消息通知多播路由器。当多播路由器接收到发给那个多播组的数据时,便会将其转发给所有的多播主机。多播路由器还会周期性地发出“主机成员查询”的IGMP消息,向子网查询多播主机,若发现某个多播组已没有任何成员,则停止转发该多播组的数据。此外,当支持IGMPv2的主机退出某个多播组时,还会向路由器发送一条“离开组”的IGMP消息,以通知路由器停止转发该多播组的数据。但只有当子网上所有主机都退出某个多播组时,路由器才会停止向该子网转发该多播组的数据。
一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据报。6.4.2组播地址
IPv4地址可划分为A、B、C、D、E和一些特殊的地址,如第4章表4-1所示。
现在由于计算机数量急剧增加,IPv4地址已经不够分配,所以逐渐放弃了IP地址的A,B,C分类法,采用划分子网和超网方式分配IP地址,但是D类地址保留了下来。
IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址。D类IP地址第一个字节以“1110”开始,范围从~55。它是一个专门保留的地址,它并不指向特定的网络,代表网络中一台虚拟的主机。D类IP地址的组成如图6-11所示。图6-11D类IP地址
D类IP地址并不是随意被使用的,这个地址范围被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类,如下:
● 局部链接多播地址范围在~55,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包,多用于在LAN中组播;
● 预留多播地址为~55,可用于全球范围(如Internet)或网络协议;
● 管理权限多播地址为~55,可供组织内部使用,类似于私有IP地址,不能用于Internet,可用于限制多播范围。6.4.3MulticastSocket类
在Java语言中,采用MulticastSocket类来实现组播套接字,其类定义如图6-12所示。图6-12MulticastSocket类定义其构造方法:
● publicMulticastSocket()throwsIOException:声明一个空的对象。
● publicMulticastSocket(intport)throwsIOException:启动本地指定UDP端口。
其主要方法:
● publicvoidjoinGroup(InetAddressmulticastAddress)throwsIOException:加入某个多播组;
● publicvoidleaveGroup(InetAddressmulticastAddress)throwsIOException: 离开某个多播组;● publicsynchronizedvoidsend(DatagramPacketp)throwsIOException: 向加入的多播组发送数据;
● publicsynchronizedvoidreceive(DatagramPacketp)throwsIOException: 从加入的多播组接收数据。
在下面的组播通信实例中,发送消息和接收数据的客户端都加入到组播组中,程序需要在例6-2和例6-3的基础上进行修改。
代码注释如下:
①第4行设置组播地址为,该组播地址仅能在局域网中使用,路由器不转发该地址组播数据,限制了数据传播的范围;
②第6行声明一个MulticastSocket对象;
③第12行在指定端口启动一个UDP端口组播套接字;
④第13行创建组播地址的InetAddress对象;
⑤第14行将本地创建的组播套接字加入到组播组中;
⑥第23~29行实现循环向组播组发送数据,值得注意的是即使发送端不属于组播组也可以向任意组播组发送数据。
代码注释如下:①第4~6行声明组播地址、组播端口和组播套接字;②第10~16行加入到组播组,只有参加组播组,接收方才能收到数据;③第19~28行从组播组中接收数据。运行结果如图6-13
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《供应商管理办法》课件
- 《保险公司运营环节》课件
- 广西选人报告范文
- 财务经营分析报告范文
- 济南西站实践报告范文
- 幼儿教师自查报告范文
- 《犯罪心理学》课件
- 清酒 研究报告范文
- 国土项目科研报告范文
- 养殖报告范文
- 五官科医院感染管理
- 规划设计方案审批全流程
- 未成年被害人“一站式办案”工作室建设与运行规范
- 《中外历史纲要(上)》期末专题复习提纲
- 2024年03月辽宁建筑职业学院招考聘用17人笔试历年(2016-2023年)真题荟萃带答案解析
- 征兵工作试题
- 情绪调试-再见emo你好+Emotion+高一下学期心理健康教育课(通用版)
- TCALC 003-2023 手术室患者人文关怀管理规范
- 酒店强电主管述职报告
- 北京市西城区2023-2024学年七年级上学期期末地理试卷
- 2023版道德与法治教案教学设计专题7 第1讲 社会主义法律的特征和运行
评论
0/150
提交评论