UDPExercise1Send
package UDPExercise20240815;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class UDPExercise1Send {
public static void main(String[] args) throws IOException {
// UDP通信程序练习
// 需求:
/*
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
*/
// 发送端
Scanner sc = new Scanner(System.in);
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket datagramPacket;
byte[] bytes; // 无需分配其大小,Java每次使用时会对其进行动态内存分配,分配一个合理的大小
while (true) {
System.out.println("请输入你想要发送的内容:");
String message = sc.nextLine();
if (message.equals("886")) {
bytes = "886".getBytes();
datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10086);
// 其构造方法:需要一个字节数组代表发送的数据,指出发送多少数据,IP地址,端口号
datagramSocket.send(datagramPacket);
break;
} else {
bytes = message.getBytes();
datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10086);
datagramSocket.send(datagramPacket);
}
}
datagramSocket.close();
}
}
UDPExercise1Receive
package UDPExercise20240815;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class UDPExercise2Receive {
public static void main(String[] args) throws IOException {
// 组播接收端
// 创建组播接收端的Socket对象(MulticastSocket)
MulticastSocket multicastSocket = new MulticastSocket(10086);
// 创建一个箱子用于接收数据
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
// 将当前计算机绑定一个组播地址,表示添加到这一组中
multicastSocket.joinGroup(InetAddress.getByName("224.0.1.0"));
// 将数据接收到箱子中
multicastSocket.receive(datagramPacket);
// 解析数据包并答应数据
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
System.out.println(new String(data, 0, length));
// 释放资源
multicastSocket.close();
// 注:
// 1.组播地址应该在224.0.0.0 - 239.255.255.255之间,否则是无效的组播地址
// 2.接收端加入一个组播组,监听特定的组播地址和端口。网络设备(如路由器)会将发送到该组播地址的数据包转发给所有加入该组的接收端。
// 3.端口共享:多个接收端可以在同一个端口上接收来自同一个组播地址的数据包,而不会产生端口冲突。这是因为组播协议允许多个应用程序在同一个端口上接收数据。
}
}
UDPExercise2Send
package UDPExercise20240815;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPExercise2send {
public static void main(String[] args) throws IOException {
// UDP有三种通讯方式
// 1.单播:用于两个主机之间的端对端的通信
// 2.组播:用于对一组特定主机进行通信
// 3.广播:用于一个主机对整个局域网上所有主机的数据通信
// UDP组播实现
// 步骤:
// 一、发送端
// 1.创建发送端的Socket对象(DatagramSocket)
// 2.创建数据,并将数据打包(DatagramPacket)
// 3.调用DatagramSocket对象的方法发送数据(单播中是发给指定IP的电脑;但是组播中是发给组播地址)
// 4.释放资源
// 二、接收端
// 1.创建一个接收端的Socket对象(MulticastSocket)
// 2.创建一个箱子,用于接收数据(单播可以用包,组播需要使用箱子)
// 3.将当前计算机绑定一个组播的地址
// 4.将接收的数据放在箱子中
// 5.解析数据包,并打印数据
// 6.释放资源
// 创建发送端的Socket对象(DatagramSocket)
DatagramSocket datagramSocket = new DatagramSocket();
String message = "hello 组播";
byte[] bytes = message.getBytes();
InetAddress ip = InetAddress.getByName("224.0.1.0");
int port = 10086;
// 创建数据,并将数据打包(DatagramPacket)
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, ip, port);
// 调用方法发送数据
datagramSocket.send(datagramPacket);
// 释放资源
datagramSocket.close();
}
}
UDPExercise2Receive
package UDPExercise20240815;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class UDPExercise2Receive {
public static void main(String[] args) throws IOException {
// 组播接收端
// 创建组播接收端的Socket对象(MulticastSocket)
MulticastSocket multicastSocket = new MulticastSocket(10086);
// 创建一个箱子用于接收数据
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
// 将当前计算机绑定一个组播地址,表示添加到这一组中
multicastSocket.joinGroup(InetAddress.getByName("224.0.1.0"));
// 将数据接收到箱子中
multicastSocket.receive(datagramPacket);
// 解析数据包并答应数据
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
System.out.println(new String(data, 0, length));
// 释放资源
multicastSocket.close();
// 注:
// 1.组播地址应该在224.0.0.0 - 239.255.255.255之间,否则是无效的组播地址
// 2.接收端加入一个组播组,监听特定的组播地址和端口。网络设备(如路由器)会将发送到该组播地址的数据包转发给所有加入该组的接收端。
// 3.端口共享:多个接收端可以在同一个端口上接收来自同一个组播地址的数据包,而不会产生端口冲突。这是因为组播协议允许多个应用程序在同一个端口上接收数据。
}
}
UDPExercise2Receive2
package UDPExercise20240815;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class UDPExercise2Receive2 {
public static void main(String[] args) throws IOException {
// 组播接收端
// 创建组播接收端的Socket对象(MulticastSocket)
MulticastSocket multicastSocket = new MulticastSocket(10086);
// 创建一个箱子用于接收数据
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
// 将当前计算机绑定一个组播地址,表示添加到这一组中
multicastSocket.joinGroup(InetAddress.getByName("224.0.1.0"));
// 将数据接收到箱子中
multicastSocket.receive(datagramPacket);
// 解析数据包并答应数据
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
System.out.println(new String(data, 0, length));
// 释放资源
multicastSocket.close();
// 注意:组播地址应该在224.0.0.0 - 239.255.255.255之间,否则是无效的组播地址
}
}
UDPExercise3Send
package UDPExercise20240815;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPExercise3Send {
public static void main(String[] args) throws IOException {
// 广播实现
// 发送端
// 1.创建发送端Socket对象(DatagramSocket)
// 2.创建存储数据的箱子,将广播地址封装进去
// 3.发送数据
// 4.释放资源
// 接收端
// 1.创建接收端对象(DatagramSocket)
// 2.创建一个数据包,用于接收数据
// 3.调用DatagramSocket对象中的方法接收数据
// 4.解析数据包,将数据在控制台显示
// 5.关闭接收端
// 1.创建发送端Socket对象
DatagramSocket datagramSocket = new DatagramSocket();
// 2.创建存储数据的箱子,将广播地址封装进去
String message = "hello 广播";
byte[] bytes = message.getBytes();
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();
}
}
UDPExercise3Receive
package UDPExercise20240815;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPExercise3Receive {
public static void main(String[] args) throws IOException {
// 1. 创建接收端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket(10000);
// 2. 创建一个数据包,用于接收数据
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
// 3. 调用DatagramSocket对象的方法接收数据
ds.receive(dp);
// 4. 解析数据包,并把数据在控制台显示
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
// 5. 关闭接收端
ds.close();
}
}