一、介绍
UDP在通信的时候有三种方式,分别是 单播、组播、广播
。
单播:一对一,左边的发送端只给右边的一台电脑发送数据。
组播:顾名思义,可以给一组电脑发送信息。
左边还是发送端,但是右边的接收端可以是一组。
广播:左边的发送端,可以给局域网中所有的电脑发送数据。
那么这三种方式代码该怎么写呢?
单播很简单,我们之前写的所有的代码都是单播形式。因为我们之前写的代码就是一对一的形式。
二、组播
组播地址,范围是 224.0.0.0 ~ 239.255.255.255
,其中如果我们自己想用,只能用 224.0.0.0 ~ 224.0.0.255
范围内的,因为这个范围是给我们预留的组播地址。
那这个组播地址和之前的IP有什么不一样呢?
之前的IP只能表示一台电脑,而这里随便一个组播地址,就可以表示多台电脑。
组播代码其实也是跟之前一模一样的。
1)发送端代码
在创建对象的时候,之前单播创建的是 DatagramSocket
,但是现在是组播,因此我们需要创建 MulticastSocket
这个类的对象才行。
其他的都是一样的,只不过在发送数据指定IP的时候,需要指定组播地址。
public static void main(String[] args) throws IOException {
//创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket();
// 创建DatagramPacket对象
String s = "你好,你好!";
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("224.0.0.1");
int port = 10000;
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
// 调用MulticastSocket发送数据方法发送数据
ms.send(datagramPacket);
// 释放资源
ms.close();
}
2)接收端代码
接收端同样也是创建 MulticastSocket
对象,但是在下面接收端多了一步:将当前本机,添加到 224.0.0.1
的这一组当中。
下面一共写了三个接收端。当我们先运行接收端,再来运行发送端发送数据的时候你会发现,这里的三个接收端都可以接收到数据。
public class ReceiveMessageDemo1 {
public static void main(String[] args) throws IOException {
//1. 创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket(10000);
//2. 将将当前本机,添加到224.0.0.1的这一组当中
InetAddress address = InetAddress.getByName("224.0.0.1");
ms.joinGroup(address);
//3. 创建DatagramPacket数据包对象
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//4. 接收数据
ms.receive(dp);
//5. 解析数据
byte[] data = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String name = dp.getAddress().getHostName();
System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data, 0, len));
//6. 释放资源
ms.close();
}
}
---------------------
public class ReceiveMessageDemo2 {
public static void main(String[] args) throws IOException {
//1. 创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket(10000);
//2. 将将当前本机,添加到224.0.0.1的这一组当中
InetAddress address = InetAddress.getByName("224.0.0.1");
ms.joinGroup(address);
//3. 创建DatagramPacket数据包对象
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//4. 接收数据
ms.receive(dp);
//5. 解析数据
byte[] data = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String name = dp.getAddress().getHostName();
System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data, 0, len));
//6. 释放资源
ms.close();
}
}
---------------------------
public class ReceiveMessageDemo3 {
public static void main(String[] args) throws IOException {
//1. 创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket(10000);
//2. 将将当前本机,添加到224.0.0.2的这一组当中
InetAddress address = InetAddress.getByName("224.0.0.1");
ms.joinGroup(address);
//3. 创建DatagramPacket数据包对象
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//4. 接收数据
ms.receive(dp);
//5. 解析数据
byte[] data = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String name = dp.getAddress().getHostName();
System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data, 0, len));
//6. 释放资源
ms.close();
}
}
三、广播
如果我们发送信息的时候,发到的是 255.255.255.255
上,此时局域网中所有的电脑都可以接收到你的信息,这就是广播。
广播其实是最简单的,代码几乎跟单播是一模一样的,我们只要把单播的地址改成 255.255.255.255
即可。
此时在发送的时候,就可以给局域网里面所有的电脑都去发生数据了。
//1.创建对象DatagramSocket的对象
DatagramSocket ds = new DatagramSocket();
//2.打包数据
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您要说的话:");
String str = sc.nextLine();
if ("886".equals(str)) {
break;
}
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
//3.发送数据
ds.send(dp);
}
//4.释放资源
ds.close();