单播只能是发送方往接收方指定的IP和端口发送数据
在IPv4网络中,0.0.0.0到223.255.255.255属于单播地址
注意:
public class UDPSend {
public static void main(String [] args) throws IOException {
System.out.println("发送端启动");
//1 创建一个发送端的socker对象-找码头。无需端口号
DatagramSocket socket = new DatagramSocket();
//2 创建发送的数据包-打包礼物
byte [] bytes = "Hello UDP!".getBytes();
// 参数说明:发送消息的字节数组,发送消息的偏移量,发送消息的长度,地址,端口
DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getByName("127.0.0.1"),2000);
//3 发送数据-由码头发送包裹
socket.send(packet);
//4 关闭发送端-付钱走羊
socket.close();
System.out.println("发送端退出");
}
}
public class UDPReceive {
public static void main(String [] args) throws IOException {
System.out.println("接收消息端启动.....");
//1. 创建接收端socker-找码头, 这个端口号一定要和发送端的DatagramPacket对象里的端口号一样。
DatagramSocket datagramSocket = new DatagramSocket(2000);
//2. 创建接收数据的数据包-找新箱子
byte [] bytes = new byte[1024];
// 参数说明接收消息的字节数组,接收消息的长度,地址,端口,这里的端口号在单播时不重要。
DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
//3. 接收数据-码头接收礼物并放入新箱子中
datagramSocket.receive(packet);
//4. 解包数据,变成字符串输出-村长从箱子里获取礼物
String content = new String(packet.getData(),0,packet.getLength());
System.out.println("收到消息:" + content);
//4. 关闭连接-拿完走羊
System.out.println("接收端退出");
}
}
单播是一对一的发送,组播就是一对多的发送,但组播是有地址段要求的。
ipv4中的组播地址范围是:224.0.0.0到239.255.255.255
224.0.0.0~224.0.0.255 为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
224.0.1.0~224.0.1.255 是公用组播地址,可以用于Internet;欲使用需申请。
224.0.2.0~238.255.255.255 为用户可用的组播地址(临时组地址),全网范围内有效;
239.0.0.0~239.255.255.255 为本地管理组播地址,仅在特定的本地范围内有效。
注意:
public class UDPMulticastSend {
public static void main(String [] args) throws IOException {
System.out.println("组播发送端启动");
//1. 创建接收端socket
DatagramSocket ds = new DatagramSocket();
String s = "hello 组播消息";
byte[] bytes = s.getBytes();
//2. 组播地址
InetAddress address = InetAddress.getByName("224.0.2.0");
// 接收方端口
int port = 10000;
//3. 创建消息数据包
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//4. 进行组播消息发送
ds.send(dp);
ds.close();
}
}
public class UDPMulticastReceive {
public static void main(String [] args) throws IOException {
String id = UUID.randomUUID().toString();
System.out.println(id + "组播接收端启动..");
//1 创建组播socket,这里和单播是不一样的。
MulticastSocket multicastSocket = new MulticastSocket(10000);
// 2 创建接收的数据包
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024],1024);
//3! 把当前计算机绑定一个组播地址,表示添加到这一组中.
multicastSocket.joinGroup(InetAddress.getByName("224.0.2.0"));
//4 接收消息包
multicastSocket.receive(datagramPacket);
String message = new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println(new String("收到消息:" + message));
}
}
public class UDPMulticastReceive2 {
public static void main(String [] args) throws IOException {
String id = UUID.randomUUID().toString();
System.out.println(id + "组播接收端启动..");
//端口要和发送方端口一一致
int port = 10000;
//1 创建组播socket,这里和单播是不一样的。
MulticastSocket multicastSocket = new MulticastSocket(port);
// 2 创建接收的数据包
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024],1024);
//3 把当前计算机绑定一个组播地址,表示添加到这一组中,这也是设置组播地址 满足前面是224
multicastSocket.joinGroup(InetAddress.getByName("224.0.2.0"));
//4 接收消息包
multicastSocket.receive(datagramPacket);
String message = new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println(new String("收到消息:" + message));
}
}
使用广播地址:255.255.255.255
另外ipv6不支持广播
注意:
public class UDPBroadcastSend {
public static void main(String [] args) throws IOException {
System.out.println("广播发送端启动");
//1 创建发送端socket
DatagramSocket datagramSocket = new DatagramSocket();
String s = "广播 hello";
byte[] bytes = s.getBytes();
// 这里和单播唯一不同的是地址不同。广播地址是255.255.255.255,不能是其它地址
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10000;
// 创建发送的数据包
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,address,port);
//发送数据
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
public class UDPBroadcastSend {
public static void main(String [] args) throws IOException {
System.out.println("广播发送端启动");
//1 创建发送端socket
DatagramSocket datagramSocket = new DatagramSocket();
String s = "广播 hello";
byte[] bytes = s.getBytes();
// 这里和单播唯一不同的是地址不同。广播地址是255.255.255.255,不能是其它地址
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10000;
// 创建发送的数据包
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,address,port);
//发送数据
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}