教育路上
摘要:Java UDP 網絡程序 案例 ,講解了 DatagramPacket 和 DatagramSocket 的作用,接下來通過一個案例 來學習。以下是我們為大家整理的,相信大家閱讀完后肯定有了自己的選擇吧。
2022-05-18 16:39網絡推薦
前面兩個小節講解了 DatagramPacket 和 DatagramSocket 的作用,接下來通過一個案例 來學習一下它們在程序中的具體用法。要實現 UDP 通信需要創建一個發送端程序和一個接 收端程序,很明顯,在通信時有接收端程序先運行,才能避免發送端發送的數據無法接收。 而造成數據丟失。因此,首先需要來完成接收端程序的編寫,如例 13-2 所示。 例 13-2 Example02.java import java.net.*; // 接收端程序 public class Example02 { public static void main(String[] args) throws Exception { byte[] buf = new byte[1024]; // 創建一個長度為 1024 的字節數組, 用于接收數據 // 定義一個 DatagramSocket 對象,監聽的端口號為 8954 DatagramSocket ds = new DatagramSocket(8954); // 定義一個 DatagramPacket 對象,用于接收數據 DatagramPacket dp = new DatagramPacket(buf, 1024); System.out.println("等待接收數據"); ds.receive(dp); // 等待接收數據,如果沒有數據則會阻塞 // 調用 DatagramPacket 的方法獲得接收到的信息,包括數據的 內容、長度、發送的 IP 地址和端口號 String str = new String(dp.getData(), 0, dp.getLength()) + "from " + dp.getAddress().getHostAddress() + ":" + dp.getPort(); System.out.println(str); // 打印接收到的信息 ds.close();// 釋放資源 } } 運行結果圖 13-7 所示
例 13-2 創建了一個接收端程序用來接收數據,在創建 DatagramSocket 對象時,指定其 監聽的端口號為 8954,這樣發送端就能通過這個端口號與接收端程序進行通信。之后創建 DatagramPacket 對象時傳入一個大小為 1024 個字節的數組用來接收數據,當調用該對象的 receive( DatagramPacket p) 方法接收到數據以后,數據會填充到 DatagramPacket 中,通過 DatagramPacket 的相關方法可以獲取接收到的數據信息。 從圖 13-7 可以看到,例 13-2 運行后,程序一直處于停滯狀態,命令行窗口中光標一直閃 動,這是因為 DatagramSocket 的 receive( )方法在運行時會發生阻塞,只有接收到發送端程 序發送的數據時,該方法才會結束這種阻塞狀態,程序才能繼續向下執行 實現了接收端程序之后,接下來還需要編寫一個發送端的程序,如例 13-3 所示 例 13-3 Example03.java //發送端程序 import java.net.*; //發送端程序 public class Example03 { public static void main(String[] args) throws Exception { // 創建一個 DatagramSocket 對象 DatagramSocket ds = new DatagramSocket(3000); String str = "hello world"; // 要發送的數據 DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("localhost"), 8954); System.out.println("發送信息"); ds.send(dp); // 發送數據 ds.close(); // 釋放資源 } } 運行結果如圖 13-8 所示。
例 13-3 創建了一個發送端程序,用來發送數據。在創建 DatagramPacket 對象時需要指 定目標 IP 地址和端口號,而且端口號必須要和接收端指定的端口號一致,這樣調用 DatagramSocket 的 send()方法才能將數據發送到對應的接收端。 在接收端程序阻塞的狀態下,運行發送端程序,接收端程序就會收到發送端發送的數據 而結束阻塞狀態,打印接收的數據如圖 13-9 所示。
需要注意的時,在創建發送端的 DatagramSocket 對象時,可以不指定端口號,而例 13-3 指定端口號的目的就是,為了每次運行時接收端的 getPort()方法返回值都是一致的,否則發 送端的端口號由系統自動分配,接收端的 getPort()方法的返回值每次都不同。 ? 腳下留心 需要注意的是,運行例 13-2,有時會出現一種異常,如圖 13-10 所示
端口號已經被其他的程序占用。遇到這種情況,可以在命令行窗口輸入"netstat-anb"命令來 查看當前計算機端口占用情況,運行結果如圖 13-11 所示。
圖 13-11 中,顯示了所有正在運行的應用程序及它們所占用的端口號。想要解決端口號 占用的問題,只需關掉占用端口號的應用程序或者為程序分配一個未被占用的端口號即可
訪客的評論 2023/11/08 20:44
文中描述的是準確的嗎,如何報名!