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);
}
}