日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Java 网络编程】UDP 服务器 与 客户端持续交互 案例

發布時間:2025/6/17 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • I UDP 交互原理
        • II UDP 服務器端代碼示例
        • III UDP 客戶端代碼示例
        • IV 服務器 客戶端 運行結果



I UDP 交互原理



1. UDP 單播傳輸流程 : A 給 B 發送數據包 , B 設備一定要處于監聽 X 端口狀態 , A 向 B 的 X 端口發送數據包 , B 才能收到 ; B 收到 A 的數據包后 , B 就知道了 A 的端口號 Z 的信息了 , 此時 B 可以向 A 的 Z 端口號發送數據包 ;

2. 局域網設備交互 : A 設備給局域網其它設備發送信息 , 并能接收到其它設備回送給 A 的信息 ;

3. 接收信息設備監聽 X 端口 : 此時 A 作為客戶端時 , 服務器需要接收 A 發送的數據包 , 服務器需要監聽一個指定的接口 X , 那么如果 A 發送廣播消息 , 監聽 X 端口的服務器就會收到 A 發送的消息 ;

4. A 提前監聽端口 Z : 如果服務器在收到消息后立刻向 A 的 Z 端口回送一個反饋信息 , 設備 A 需要在發送消息之前就監聽 Z 端口 , 才能實現上述功能 ;

5. 持續交互 : A 不斷向其它設備的 X 端口發送信息 , 其它設備可以不斷反饋信息給設備 A 的 Z 端口 , 這樣就實現了客戶端與服務器端數據交互的功能 ;



II UDP 服務器端代碼示例



import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import java.util.ArrayList;public class UDPServer {public static void main(String[] args){System.out.println("服務器 開始運行");//開啟接收數據的線程ReceiveThread receiveThread = new ReceiveThread();receiveThread.start();}/*** 服務器端監聽客戶端發送的信息*/private static class ReceiveThread extends Thread{/*** 是否繼續監聽 , 循環控制變量*/boolean isReceive = true;/*** 存儲發送數據的客戶端信息*/ArrayList<Client> clients = new ArrayList<>();@Overridepublic void run() {super.run();try {//I. 創建 DatagramSocket 對象 , 用于 UDP 數據包的發送和接收//1. UDP 數據包接收者 , 監聽 8888 端口// 該 DatagramSocket 既可以接收數據包 , 也可以發送數據包DatagramSocket datagramSocket = new DatagramSocket(8888);//II. 接收 UDP 數據包 , 無限循環接收來自客戶端的信息 , 并根據不同的信息進行不同處理while (isReceive){//2. 接收數據包使用的緩沖區byte[] receiveBuffer = new byte[256];//3. 接收 UDP 數據包使用的 DatagramPacket 對象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//4. 接收 UDP 數據包datagramSocket.receive(receivePacket);//5. 獲取發送端的 IP 地址String sendIP = receivePacket.getAddress().getHostAddress();//6. 獲取發送端的端口號int sendPort = receivePacket.getPort();//7. 獲取接收到的數據的長度int receiveLen = receivePacket.getLength();//8. 獲取接收到的數據 , 并轉為字符串String receiveData = new String(receivePacket.getData(), 0, receiveLen);//9. 打印接收到的數據包信息System.out.println("服務器 接收到 " + sendIP + " : " + sendPort + " 發送的數據 : " + receiveData);//將客戶端信息發送到//III. 發送 UDP 數據包//10. 將接收到的數據長度回送給發送者String response = "服務器端 收到客戶端發送的 " + receiveLen + " Byte 數據";//11. 將字符串轉為 byte[] 數組byte[] responseData = response.getBytes();//12. 創建發送數據包 , 需要傳入的參數 1> 數據 2> 數據長度 3> 接收者的地址 4> 接收者的端口號DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length,receivePacket.getAddress(), receivePacket.getPort());//13. 將數據包發送出去datagramSocket.send(responsePacket);System.out.println("服務器 向客戶端 " + sendIP + " : " + sendPort + " 發送的數據 : " + response);//退出服務器循環if("exit".equals(receiveData)){isReceive = false;}}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("服務器 運行結束");}}}/*** 封裝向服務器端發送數據的客戶端信息* 主要是保存客戶端的 IP 地址和端口號*/private static class Client{String ClientIP;String ClientPort;public Client(String clientIP, String clientPort) {ClientIP = clientIP;ClientPort = clientPort;}}}

III UDP 客戶端代碼示例



import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException;public class UDPClient {public static void main(String[] args){try {System.out.println("客戶端 開始運行");//I. 創建 DatagramSocket 對象 , 用于 UDP 數據包的發送和接收//1. UDP 數據包套接字 , 客戶端 ,// 監聽 8889 端口 , 發送和接收數據包都使用該端口DatagramSocket datagramSocket = new DatagramSocket(8889);//II. 人機交互控制臺阻塞獲取用戶輸入//1. 獲取控制臺輸入流InputStream is = System.in;//2. 該輸入流會阻塞 , 等待用戶控制臺輸入BufferedReader br = new BufferedReader(new InputStreamReader(is));// 循環控制變量 , 循環發送和接收 UDP 數據包boolean flag = true;while(flag){//3. 阻塞命令行 , 等待用戶輸入一行數據, 并存入 string 對象中String string = br.readLine();//III. 向服務器發送 UDP 數據包//1. 將字符串轉為 byte[] 數組byte[] sendData = string.getBytes();//2. 創建發送數據包 , 需要傳入的參數 1> 數據 2> 數據長度 3> 接收者的地址 4> 接收者的端口號// 向服務器端發送數據 , 發送的端口是自動分配的DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,InetAddress.getLocalHost(), 8888);//3. 將數據包發送出去datagramSocket.send(sendPacket);System.out.println("客戶端 向服務器 : " +InetAddress.getLocalHost() + " : " + 8888 + " 發送的數據 : " + string);//4. 退出if("exit".equals(string)){flag = false;}//IV. 接收服務器反饋的 UDP 數據包//1. 接收數據包使用的緩沖區byte[] receiveBuffer = new byte[1024];//2. 接收 UDP 數據包使用的 DatagramPacket 對象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//3. 接收 UDP 數據包datagramSocket.receive(receivePacket);//4. 獲取發送端的 IP 地址String sendIP = receivePacket.getAddress().getHostAddress();//5. 獲取發送端的端口號int sendPort = receivePacket.getPort();//6. 獲取接收到的數據的長度int receiveLen = receivePacket.getLength();//7. 獲取接收到的數據 , 并轉為字符串String receiveData = new String(receivePacket.getData(), 0, receiveLen);//8. 打印接收到的數據包信息System.out.println("客戶端 接收到服務器端反饋信息 : " +sendIP + " : " + sendPort + " 發送的數據 : " + receiveData);}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("客戶端 運行結束");}}}

IV 服務器 客戶端 運行結果



先運行服務器端 , 再運行客戶端 ;

總結

以上是生活随笔為你收集整理的【Java 网络编程】UDP 服务器 与 客户端持续交互 案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。