02 UDP通信
一、UDP发送数据的步骤
- 创建发送端的DatagramSocket对象
- 创建数据并把数据打包
- 调用DatagramSocket发送数据
- 释放资源
二、UDP接收数据的步骤
- 创建接收端的DatagramSocket对象,端口号和发送端一样
- 创建DatagramPacket接收数据
- 调用DatagramSocket发送数据
- 解析资源
- 释放资源
三、UDP的三种通信方式
- 单播
- 组播
- 局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。
- 预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。
- 管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
- 广播
广播地址:255.255.255.255
四、单播实例
发送数据端:
import java.io.IOException;
import java.net.*;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//1. 创建发送端的DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//2. 创建数据并把数据打包
String str="hello world !";
byte[] bytes = str.getBytes();
DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("127.0.0.1"),10000);
//3. 调用DatagramSocket发送数据
socket.send(packet);
//4. 释放资源
socket.close();
}
}
接收数据端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//1. 创建接收端的DatagramSocket对象,端口号和发送端一样
DatagramSocket socket = new DatagramSocket(10000);
//2. 创建DatagramPacket接收数据
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//3. 调用DatagramSocket发送数据
socket.receive(packet);
//4. 解析资源
byte[] data = packet.getData();
int length=packet.getLength();
String str = new String(data,0,length);
//5. 释放资源
socket.close();
System.out.print("接收的资源是:" + str);
}
}
五、组播实例
发送数据端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ServerDemo2 {
public static void main(String[] args) throws IOException {
//1. 创建发送端的DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//2. 创建数据并把数据打包
String str = "组播数据:hello world !";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("224.0.1.1");
int port = 10000;
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
//3. 调用DatagramSocket发送数据
socket.send(packet);
//4. 释放资源
socket.close();
}
}
接收数据端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ClientDemo2 {
public static void main(String[] args) throws IOException {
//1. 创建接收端的 MulticastSocket 对象,端口号和发送端一样
MulticastSocket ms = new MulticastSocket(10000);
//2. 把当前计算机绑定一个组播地址,表示添加到这一组中
ms.joinGroup(InetAddress.getByName("224.0.1.1"));
//3. 创建DatagramPacket接收数据
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//4. 调用DatagramSocket发送数据
ms.receive(packet);
//5. 解析资源
int length=packet.getLength();
String str = new String(bytes,0,length);
//6. 释放资源
ms.close();
System.out.print("接收的广播数据:" + str);
}
}
六、广播实例
发送数据端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ServerDemo1 {
public static void main(String[] args) throws IOException {
//1. 创建发送端的DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//2. 创建数据并把数据打包
String str = "广播数据:hello world !";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10000;
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
//3. 调用DatagramSocket发送数据
socket.send(packet);
//4. 释放资源
socket.close();
}
}
接收数据端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ClientDemo1 {
public static void main(String[] args) throws IOException {
//1. 创建接收端的DatagramSocket对象,端口号和发送端一样
DatagramSocket socket = new DatagramSocket(10000);
//2. 创建DatagramPacket接收数据
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//3. 调用DatagramSocket发送数据
socket.receive(packet);
//4. 解析资源
int length=packet.getLength();
String str = new String(bytes,0,length);
//5. 释放资源
socket.close();
System.out.print("接收的广播数据:" + str);
}
}