UDP三种通信方式
单播(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();}}
}