JAVA中的IP多播与UDP通信
基础理论知识
IP地址的分类
IP地址分为A类地址、B类地址、C类地址、D类地址、E类地址。其中D类地址为多播地址。
IP多播
IP多播所传送的分组需要使用多播IP地址。我们知道在互联网中每一台主机都必须有一个全球唯一的IP地址,那么如果我们想接收到某个特定的多播组的分组该怎么办呢?
显然,这个多播组数据报的目的地址肯定不能写入这台主机的IP地址,因为此时可能有成千上万台电脑等着接收这个多播数据报,其首部肯定无法装入这么多的IP地址的。但是我们可以在多播数据报的目标地址中写入多播组的标识符
,然后设法让加入到这个多播组的IP地址与多播组的标识符关联起来。
其实,所谓的多播组的标识符
就是D类IP地址
。
很显然,多播地址只能用于目的地址,不能用于源地址。而且多播报文不会产生ICMP差错报文(因为多播是UDP实现的)
使用的协议
如果某台主机发送多播数据报,那么其连接的路由器又怎么知道多播组的成员信息呢?
其实IGMP协议
,中文名称网际组管理协议
,就是用来解决这个问题的。
IGMP协议是让连接在本地局域网上的多播路由器知道本局域网上是否又主机参加了或者退出了某个多播组。
当然了,为了让本地局域网的路由器可以和互联网上的路由器协同工作,以便于用最小代价传送给所有组播成员,所以网络大佬还发明了多播路由选择协议
协议的详细知识,请参考《计算机网络》 谢希仁
JAVA 中的IP多播与UDP通信
DatagramSocket
DatagramSocket
此类表示用于发送和接收数据报数据包的套接字。 其底层实现协议是UDP,所以不需要进行连接,可以直接发送数据。
其构造方法如下
上面四个构造方法,常用的即第一个或者第三个,如果指定IP地址的话,通常指定为0.0.0.0
,别问为什么,自己百度去。
如果想接收UDP数据报或者发送UDP数据报,则用如下两个方法
因为数据报格式也被协议所约束的,所以我们还要通过一层DatagramPacket
来封装我们想要发送的数据
我们还可以设置是否启用广播功能
DatagramPacket
DatagramPacket
该类表示数据报包,数据报包用于实现无连接分组传送服务,仅基于该数据包中包含的信息。
其构造方法如下
因为UDP想要发送数据报,就肯定要指定对方的IP地址和端口号,所以,上述构造参数中(第二个、第四个、第五、六个)部分需要IP地址和端口。我们需要注意的是,这里的IP地址是指的目的地址
如果在初始的时候没有设置目的地址和端口号,那么我们可以通过下面方法进行设置
如果我们想重修设置一下 数据区
,可以使用下面方法
如果我们想要获取数据,则可以使用下面方法
MulticastSocket
MulticastSocket
是组播数据报套接字类对发送和接收IP组播数据包很有用,他是DatagramSocket
的子类,其父类没有组播功能,所以才出现了MulticastSocket
,这个类可以很轻松的实现组播功能。
组播组由D类IP地址和标准UDP端口号指定。 D类IP地址范围为224.0.0.0至239.255.255.255 (含)。 地址224.0.0.0是保留的,不应该使用
其构造方法如下
常用的就是第一个或者第二个。
为了能够实现组播,我们必须要加入到某个组播地址中,使用如下方法
既然能够加入组播地址,就肯定能离开组播地址。使用方法如下
上面大概就是JAVA中几个跟UDP相关的类了,通过他们我们可以很轻松的忽略UDP协议通信的细节,来写出我们自己的程序。不过还是建议去看看《计算机网络》这本书,有助于你理解网络的工作原理。