一、傳送資料步驟:
1. 建立DatagramSocket物件,負責利用UDP協議往外傳送資料(DatagramSocket中既有傳送的方法,也有接收的方法)
2. 把資料打包(DatagramPacket)。把所有資料放到DatagramPacket當中
3. 傳送資料
4. 釋放資源
程式碼實現:
public static void main(String[] args) throws Exception {
// 1. 建立DatagramSocket物件
// 細節:建立DatagramSocket物件的時候,它還會去繫結對應的埠,以後我們就是透過這個埠往外傳送資料。如果是空參構造,會在所有可用的埠中隨機一個
DatagramSocket ds = new DatagramSocket();
// 2. 打包資料
String str = "你好啊";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
// 3. 傳送資料
ds.send(dp);
// 4.釋放資源
ds.close();
}
我DatagramSocket不是空參構造嗎,它隨機一個埠。那我後面為什麼還要指定一個10086埠?
答:在上述程式碼中,雖然你使用了 DatagramSocket 的空參構造方法建立了一個 DatagramSocket 物件,但在建立 DatagramPacket 物件時,你指定了目標地址和埠號。這個埠號是目標主機(這裡是 127.0.0.1)上等待接收資料的埠號,而不是傳送資料的埠號。
即使 DatagramSocket 的構造方法隨機選擇了一個本地埠來傳送資料,但在 DatagramPacket 中指定了目標地址和埠,這確保了資料將被髮送到指定的目標地址和埠,而不是隨機選擇的埠。因此,即使你沒有明確指定傳送資料的埠號,你仍然需要指定接收資料的目標埠號,以確保資料被正確路由到目標主機上的正確埠。
------------------------------------------------------------------------------------------------
二、接收資料步驟:
1. 建立DatagramSocket物件,負責利用UDP協議接收資料(DatagramSocket中既有傳送的方法,也有接收的方法)
2. 接收打包好的資料
3. 解析資料包
4. 釋放資源
程式碼實現:
public static void main(String[] args) throws Exception {
// 1. 建立DatagramSocket物件
// 細節:在接收的時候,一定要繫結埠,而且繫結的埠一定要跟傳送的埠保持一致
DatagramSocket ds = new DatagramSocket(10086);
// 2. 接收資料包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp); // receive方法是阻塞的,就是程式執行到這一步的時候,它會在這裡死等,等傳送端傳送訊息
// 3. 解析資料包
byte[] data = dp.getData();
int length = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到資料" + new String(data, 0, length));
System.out.println("該資料是從" + address + "這臺電腦中的" + port + "這個埠發出的");
// 4. 釋放資源
ds.close();
}