单播(Unicast)
单播是最常见的通信方式,数据从一个发送方传输到一个特定的接收方。发送方将数据包发送到接收方的IP地址和端口号,接收方通过监听指定的端口接收数据。单播适用于一对一的通信场景。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSender {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket();
String message = "Hello, World!";
byte[] buffer = message.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 12345);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收方
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceiver {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket(12345);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String receivedMessage = new String(packet.getData(), 0, packet.getLength());
System.out.println(receivedMessage);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
广播(Broadcast)
广播是将数据包发送到同一网络中的所有设备。发送方将数据包发送到广播地址(如255.255.255.255),所有在同一网络中的设备都能接收到该数据包。广播适用于一对多的通信场景,但会占用大量网络带宽。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSender {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket();
socket.setBroadcast(true);
String message = "Hello, Everyone!";
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("255.255.255.255"), 12345);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收方代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceiver {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket(12345);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String receivedMessage = new String(packet.getData(), 0, packet.getLength());
System.out.println(receivedMessage);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
组播(Multicast)
组播是将数据包发送到一组特定的设备。发送方将数据包发送到组播地址(如224.0.0.1),只有加入该组播组的设备才能接收到数据包。组播适用于一对多的通信场景,且比广播更节省网络带宽。
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MulticastSender {
public static void main(String[] args) {
try {
InetAddress group = InetAddress.getByName("224.0.0.1");
MulticastSocket socket = new MulticastSocket();
String message = "Hello, Group!";
DatagramPacket packet = new DatagramPacket(message.getBytes(), message.length(), group, 12345);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收方
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MulticastReceiver {
public static void main(String[] args) {
try {
InetAddress group = InetAddress.getByName("224.0.0.1");
MulticastSocket socket = new MulticastSocket(12345);
socket.joinGroup(group);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println(received);
socket.leaveGroup(group);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}