UDP的三种通信方式
单播:单台主机与单台主机之间的通信。
广播:当前主机与所在网络中的所有主机通信。
组播:当前主机与选定的一组主机的通信。
UDP如何实现广播
使用广播地址:255.255.255.255
具体操作:
发送端发送的数据包的目的地写的是广播地址、且指定端口。 (255.255.255.255 , 9999)
本机所在网段的其他主机的程序只要注册对应端口就可以收到消息了。(9999)
代码实现:
public class ClientDemo1 {
public static void main(String[] args) throws Exception {
System.out.println("=====客户端启动======");
// 1、创建发送端对象:发送端自带默认的端口号(人)
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
if("exit".equals(msg)){
System.out.println("离线成功!");
socket.close();
break;
}
// 2、创建一个数据包对象封装数据(韭菜盘子)
byte[] buffer = msg.getBytes();
// 注意:只要目的地IP是 255.255.255.255 这个消息将以广播的形式对外发送
DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
InetAddress.getByName("255.255.255.255") , 8888);
// 3、发送数据出去
socket.send(packet);
}
}
}
public class ServerDemo2 {
public static void main(String[] args) throws Exception {
System.out.println("=====服务端启动======");
// 1、创建接收端对象:注册端口(人)
DatagramSocket socket = new DatagramSocket(8888);
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
// 3、等待接收数据。
socket.receive(packet);
// 4、取出数据即可
// 读取多少倒出多少
int len = packet.getLength();
String rs = new String(buffer,0, len);
System.out.println("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
}
}
}
UDP如何实现组播
使用组播地址:224.0.0.0(不含) ~ 239.255.255.255(含)
具体操作:
发送端的数据包的目的地是组播IP (例如:224.0.1.1, 端口:9999)
接收端必须绑定该组播IP(224.0.1.1),端口还要注册发送端的目的端口9999 ,这样即可接收该组播消息。
DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP。
代码实现:
public class ClientDemo1 {
public static void main(String[] args) throws Exception {
System.out.println("=====客户端启动======");
// 1、创建发送端对象:发送端自带默认的端口号(人)
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
if("exit".equals(msg)){
System.out.println("离线成功!");
socket.close();
break;
}
// 2、创建一个数据包对象封装数据(韭菜盘子)
byte[] buffer = msg.getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
InetAddress.getByName("224.0.1.1") , 9898);
// 3、发送数据出去
socket.send(packet);
}
}
}
public class ServerDemo3 {
public static void main(String[] args) throws Exception {
System.out.println("=====服务端启动======");
// 1、创建接收端对象:注册端口(人)
MulticastSocket socket = new MulticastSocket(9898);
// 注意:绑定组播地址(加群)
socket.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1") , 9898),
NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
// 3、等待接收数据。
socket.receive(packet);
// 4、取出数据即可
// 读取多少倒出多少
int len = packet.getLength();
String rs = new String(buffer,0, len);
System.out.println("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
}
}
}