日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2025/6/17 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • I UDP 交互原理
        • II UDP 服務(wù)器端代碼示例
        • III UDP 客戶端代碼示例
        • IV 服務(wù)器 客戶端 運(yùn)行結(jié)果



I UDP 交互原理



1. UDP 單播傳輸流程 : A 給 B 發(fā)送數(shù)據(jù)包 , B 設(shè)備一定要處于監(jiān)聽(tīng) X 端口狀態(tài) , A 向 B 的 X 端口發(fā)送數(shù)據(jù)包 , B 才能收到 ; B 收到 A 的數(shù)據(jù)包后 , B 就知道了 A 的端口號(hào) Z 的信息了 , 此時(shí) B 可以向 A 的 Z 端口號(hào)發(fā)送數(shù)據(jù)包 ;

2. 局域網(wǎng)設(shè)備交互 : A 設(shè)備給局域網(wǎng)其它設(shè)備發(fā)送信息 , 并能接收到其它設(shè)備回送給 A 的信息 ;

3. 接收信息設(shè)備監(jiān)聽(tīng) X 端口 : 此時(shí) A 作為客戶端時(shí) , 服務(wù)器需要接收 A 發(fā)送的數(shù)據(jù)包 , 服務(wù)器需要監(jiān)聽(tīng)一個(gè)指定的接口 X , 那么如果 A 發(fā)送廣播消息 , 監(jiān)聽(tīng) X 端口的服務(wù)器就會(huì)收到 A 發(fā)送的消息 ;

4. A 提前監(jiān)聽(tīng)端口 Z : 如果服務(wù)器在收到消息后立刻向 A 的 Z 端口回送一個(gè)反饋信息 , 設(shè)備 A 需要在發(fā)送消息之前就監(jiān)聽(tīng) Z 端口 , 才能實(shí)現(xiàn)上述功能 ;

5. 持續(xù)交互 : A 不斷向其它設(shè)備的 X 端口發(fā)送信息 , 其它設(shè)備可以不斷反饋信息給設(shè)備 A 的 Z 端口 , 這樣就實(shí)現(xiàn)了客戶端與服務(wù)器端數(shù)據(jù)交互的功能 ;



II UDP 服務(wù)器端代碼示例



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("服務(wù)器 開(kāi)始運(yùn)行");//開(kāi)啟接收數(shù)據(jù)的線程ReceiveThread receiveThread = new ReceiveThread();receiveThread.start();}/*** 服務(wù)器端監(jiān)聽(tīng)客戶端發(fā)送的信息*/private static class ReceiveThread extends Thread{/*** 是否繼續(xù)監(jiān)聽(tīng) , 循環(huán)控制變量*/boolean isReceive = true;/*** 存儲(chǔ)發(fā)送數(shù)據(jù)的客戶端信息*/ArrayList<Client> clients = new ArrayList<>();@Overridepublic void run() {super.run();try {//I. 創(chuàng)建 DatagramSocket 對(duì)象 , 用于 UDP 數(shù)據(jù)包的發(fā)送和接收//1. UDP 數(shù)據(jù)包接收者 , 監(jiān)聽(tīng) 8888 端口// 該 DatagramSocket 既可以接收數(shù)據(jù)包 , 也可以發(fā)送數(shù)據(jù)包DatagramSocket datagramSocket = new DatagramSocket(8888);//II. 接收 UDP 數(shù)據(jù)包 , 無(wú)限循環(huán)接收來(lái)自客戶端的信息 , 并根據(jù)不同的信息進(jìn)行不同處理while (isReceive){//2. 接收數(shù)據(jù)包使用的緩沖區(qū)byte[] receiveBuffer = new byte[256];//3. 接收 UDP 數(shù)據(jù)包使用的 DatagramPacket 對(duì)象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//4. 接收 UDP 數(shù)據(jù)包datagramSocket.receive(receivePacket);//5. 獲取發(fā)送端的 IP 地址String sendIP = receivePacket.getAddress().getHostAddress();//6. 獲取發(fā)送端的端口號(hào)int sendPort = receivePacket.getPort();//7. 獲取接收到的數(shù)據(jù)的長(zhǎng)度int receiveLen = receivePacket.getLength();//8. 獲取接收到的數(shù)據(jù) , 并轉(zhuǎn)為字符串String receiveData = new String(receivePacket.getData(), 0, receiveLen);//9. 打印接收到的數(shù)據(jù)包信息System.out.println("服務(wù)器 接收到 " + sendIP + " : " + sendPort + " 發(fā)送的數(shù)據(jù) : " + receiveData);//將客戶端信息發(fā)送到//III. 發(fā)送 UDP 數(shù)據(jù)包//10. 將接收到的數(shù)據(jù)長(zhǎng)度回送給發(fā)送者String response = "服務(wù)器端 收到客戶端發(fā)送的 " + receiveLen + " Byte 數(shù)據(jù)";//11. 將字符串轉(zhuǎn)為 byte[] 數(shù)組byte[] responseData = response.getBytes();//12. 創(chuàng)建發(fā)送數(shù)據(jù)包 , 需要傳入的參數(shù) 1> 數(shù)據(jù) 2> 數(shù)據(jù)長(zhǎng)度 3> 接收者的地址 4> 接收者的端口號(hào)DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length,receivePacket.getAddress(), receivePacket.getPort());//13. 將數(shù)據(jù)包發(fā)送出去datagramSocket.send(responsePacket);System.out.println("服務(wù)器 向客戶端 " + sendIP + " : " + sendPort + " 發(fā)送的數(shù)據(jù) : " + response);//退出服務(wù)器循環(huán)if("exit".equals(receiveData)){isReceive = false;}}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("服務(wù)器 運(yùn)行結(jié)束");}}}/*** 封裝向服務(wù)器端發(fā)送數(shù)據(jù)的客戶端信息* 主要是保存客戶端的 IP 地址和端口號(hào)*/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("客戶端 開(kāi)始運(yùn)行");//I. 創(chuàng)建 DatagramSocket 對(duì)象 , 用于 UDP 數(shù)據(jù)包的發(fā)送和接收//1. UDP 數(shù)據(jù)包套接字 , 客戶端 ,// 監(jiān)聽(tīng) 8889 端口 , 發(fā)送和接收數(shù)據(jù)包都使用該端口DatagramSocket datagramSocket = new DatagramSocket(8889);//II. 人機(jī)交互控制臺(tái)阻塞獲取用戶輸入//1. 獲取控制臺(tái)輸入流InputStream is = System.in;//2. 該輸入流會(huì)阻塞 , 等待用戶控制臺(tái)輸入BufferedReader br = new BufferedReader(new InputStreamReader(is));// 循環(huán)控制變量 , 循環(huán)發(fā)送和接收 UDP 數(shù)據(jù)包boolean flag = true;while(flag){//3. 阻塞命令行 , 等待用戶輸入一行數(shù)據(jù), 并存入 string 對(duì)象中String string = br.readLine();//III. 向服務(wù)器發(fā)送 UDP 數(shù)據(jù)包//1. 將字符串轉(zhuǎn)為 byte[] 數(shù)組byte[] sendData = string.getBytes();//2. 創(chuàng)建發(fā)送數(shù)據(jù)包 , 需要傳入的參數(shù) 1> 數(shù)據(jù) 2> 數(shù)據(jù)長(zhǎng)度 3> 接收者的地址 4> 接收者的端口號(hào)// 向服務(wù)器端發(fā)送數(shù)據(jù) , 發(fā)送的端口是自動(dòng)分配的DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,InetAddress.getLocalHost(), 8888);//3. 將數(shù)據(jù)包發(fā)送出去datagramSocket.send(sendPacket);System.out.println("客戶端 向服務(wù)器 : " +InetAddress.getLocalHost() + " : " + 8888 + " 發(fā)送的數(shù)據(jù) : " + string);//4. 退出if("exit".equals(string)){flag = false;}//IV. 接收服務(wù)器反饋的 UDP 數(shù)據(jù)包//1. 接收數(shù)據(jù)包使用的緩沖區(qū)byte[] receiveBuffer = new byte[1024];//2. 接收 UDP 數(shù)據(jù)包使用的 DatagramPacket 對(duì)象DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);//3. 接收 UDP 數(shù)據(jù)包datagramSocket.receive(receivePacket);//4. 獲取發(fā)送端的 IP 地址String sendIP = receivePacket.getAddress().getHostAddress();//5. 獲取發(fā)送端的端口號(hào)int sendPort = receivePacket.getPort();//6. 獲取接收到的數(shù)據(jù)的長(zhǎng)度int receiveLen = receivePacket.getLength();//7. 獲取接收到的數(shù)據(jù) , 并轉(zhuǎn)為字符串String receiveData = new String(receivePacket.getData(), 0, receiveLen);//8. 打印接收到的數(shù)據(jù)包信息System.out.println("客戶端 接收到服務(wù)器端反饋信息 : " +sendIP + " : " + sendPort + " 發(fā)送的數(shù)據(jù) : " + receiveData);}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {System.out.println("客戶端 運(yùn)行結(jié)束");}}}

IV 服務(wù)器 客戶端 運(yùn)行結(jié)果



先運(yùn)行服務(wù)器端 , 再運(yùn)行客戶端 ;

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美毛片网站 | 男人肌肌桶女人肌肌 | 在线看免费毛片 | 91久久国产综合久久91 | 老熟妇仑乱一区二区视频 | 99自拍偷拍视频 | 色窝av | 精人妻一区二区三区 | 成在人线av | 国产一区二区片 | 国产视频一区二区三区在线观看 | 人妻激情偷乱视频一区二区三区 | 在线观看免费黄色 | 久草视频在线资源站 | 日韩黄色成人 | 亚洲精品视频在线看 | 丰满少妇被猛烈进入高清播放 | 琪琪色综合网 | 亚洲一级大片 | 91你懂的 | 春日野结衣av | 国产一级视频免费观看 | 欧美色图一区 | 中文字幕一区二区三区视频 | 亚洲成a人片 | 探花国产精品一区二区 | 好色视频tv | 精品一区二区在线观看 | 成人交配视频 | av观看网站 | 欧美另类人妖 | 亚洲美女爱爱 | 日韩精品成人在线观看 | 一区二区在线观看av | 色操插 | 日本顶级大片 | 免费99精品国产自在在线 | 伊人网综合 | 黄色免费视屏 | 中国女人内精69xxxxxx | 国产高清免费观看 | 国产主播毛片 | 久久伊人99 | 9i免费看片黄 | 国产婷婷色综合av蜜臀av | 成人乱码一区二区三区 | 无码人妻一区二区三区av | 蜜桃臀av| 一级二级三级黄色片 | 亚洲网站在线播放 | 成人av网站在线观看 | 国产麻豆免费视频 | 男人扒女人添高潮视频 | 超碰97av | 日日撸夜夜操 | 久久激情综合网 | 菠萝菠萝蜜网站 | www.999热| 日韩精品首页 | 成人在线综合 | 国产东北露脸精品视频 | 日本在线一区二区 | 成人福利在线视频 | 日韩香蕉网 | 日韩二区在线观看 | 久久婷婷影院 | 2019国产在线 | 一区二区视频国产 | 麻豆亚洲av熟女国产一区二 | 色婷婷在线观看视频 | 国产精品自拍合集 | 女尊高h男高潮呻吟 | av不卡在线看 | 青青草免费观看视频 | 中文字幕人妻精品一区 | 欧美日本在线播放 | 免费观看成人在线视频 | 中国一级黄色大片 | 青青草官网 | 日韩片在线 | 深爱激情综合 | 国产精品视频免费在线观看 | 欧美精品在线观看一区二区 | 日韩欧美日本 | 天堂综合在线 | 俄罗斯女人裸体性做爰 | 国产女女调教女同 | 福利视频网站 | 亚洲国产精品免费在线观看 | 日韩视频播放 | 国产精品人妻一区二区三区 | 亚洲国产成人一区 | 国产欧美在线观看 | 青草av在线 | 91久久精品www人人做人人爽 | 欧美区日韩区 | 羞羞软件 | 寂寞人妻瑜伽被教练日 | 欧美色亚洲色 |