Java網絡通信UDP

目錄

網絡通信基礎

UDP通信

服務器

1.想要使用UDP通信 要先打開DatagramSocket文件 端口號可以手動指定或系統隨機分配

2.阻塞等待接收客戶端數據;創建DatagramPacket接收客戶端傳來的數據

3.處理客戶端傳來的數據,并進行業務處理(這里只演示UDP通信 所以只是回傳數據)

4.處理數據成DatagramPacket并發送數據給客戶端

整體代碼

客戶端

1.創建DatagramSocket (這里客戶端端口號系統分配即可,不允許和服務器同一端口號)

2.客戶端接收用戶的數據

3.處理用戶數據成DatagramPacket 指定要發送服務器的地址與端口號

4.發送數據給客戶端

5.阻塞等待服務器響應

6.處理服務器響應的數據

7.顯示數據給用戶

整體代碼

繼承服務器代碼,重寫業務代碼即可


網絡通信基礎

  1. 物理層:網絡通信的基礎設施? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 運快遞的公路
  2. 數據鏈路層:兩個相鄰的節點之間如何傳輸? ? ? ? ? ? ? ?兩個集散點之間的傳輸
  3. 網絡層:兩個點之間的路徑規劃? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?物流公司規劃快遞的路徑
  4. 傳輸層:兩個點之間的通信(不考慮路徑規劃)? ? ? ? 賣家發貨 只考慮起點和終點
  5. 應用層:數據傳輸過去之后 如何使用? ? ? ? ? ? ? ? ? ? ? ? ?快遞拿到之后如何使用

網絡編程的主要工作寫應用層的代碼,處理應用層的協議數據

從5->1往下傳輸 每次傳輸都會依次添加報頭 稱為封裝? ? QQ1發送

從1->5往上傳輸 每次傳輸都會解析去掉報頭? ? ? ? ? ? ? ? ? ?QQ2接收

傳輸層提供兩種協議

TCP:有連接,可靠傳輸,面向字節流,全雙工

UDP:無連接,不可靠傳輸,面向數據包,半雙工

可靠傳輸:數據對方有沒有接收到,發送方有感知;打電話就是可靠的,可以知道對方有沒有聽到。

不可靠傳輸:數據對方有沒有接收到,不管,也不知道;微信就是不可靠,不知道對方有沒有看到我的消息。

全雙工:雙向通信 可以A->B B->A 同時進行

半雙工:單向通信 A->B或者B->A 同時只允許一個進行

程序要進行網絡通信,需要一個端口號(客戶端與服務器的端口號不能相同!)

端口號相當于用來在網絡上區分進行的身份標識符

分配端口號有 1.手動指定 2.系統自動分配

UDP通信

UDP的Socket API

DatagramSocket和DatagramPaclet 核心類

socket類本質相當于文件 構造一個DatagramSock對象,相當于打開了一個內核中的socket文件

打開后就可以傳輸數據了

傳輸數據已 DatagramPacket為基本單位

InetSocketAddress類 IP地址+端口號

send發送數據 receive接收數據 close關閉數據

DatagramOacket 表示一個UDP數據報 UDP是面向數據報的協議

服務器

1.想要使用UDP通信 要先打開DatagramSocket文件 端口號可以手動指定或系統隨機分配

    //想要使用UDP服務器 要打開一個文件private DatagramSocket socket=null;//創建對象//服務器IP和端口號是提供給客戶端 方便客戶端知道地址發送過來public Test1(int port) throws SocketException {socket=new DatagramSocket(port);//創建實例  綁定進程端口號

2.阻塞等待接收客戶端數據;創建DatagramPacket接收客戶端傳來的數據

            DatagramPacket datagramPacket=new DatagramPacket(new byte[4096],4096);//客戶端發來的請求放到參數datagramPacket  輸出性參數System.out.println("我正在等待!");socket.receive(datagramPacket);//阻塞等待 客戶端發起請求System.out.println("服務器接收到數據");

3.處理客戶端傳來的數據,并進行業務處理(這里只演示UDP通信 所以只是回傳數據)

//把傳來的數據構造成數據 1.獲取數據 從0開始構造 構造到數據結尾String request=new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println("接收到的數據:"+request);//處理業務String requst=process(request);System.out.println("服務器處理數據");public String process(String s){return s;}

4.處理數據成DatagramPacket并發送數據給客戶端

//要傳回客戶端也要把數據構造成DatagramPacket//把string構造到byte字節  1.字節數據,2.字節長度 3.客戶端的id+客戶端的端口號DatagramPacket datagramPackets=new DatagramPacket(request.getBytes(),request.getBytes().length,datagramPacket.getSocketAddress());//發送數據socket.send(datagramPackets);System.out.println("服務器發送數據成功");System.out.printf("[地址:%s:端口號:%d] 發來數據:%s 服務器響應數據:%s\n",datagramPacket.getAddress().toString(),datagramPacket.getPort(),request,requst);

整體代碼

package DemoUDP;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;//服務端
public class Test1 {//想要使用UDP服務器 要打開一個文件private DatagramSocket socket=null;//創建對象//服務器IP和端口號是提供給客戶端 方便客戶端知道地址發送過來public Test1(int port) throws SocketException {socket=new DatagramSocket(port);//創建實例  綁定進程端口號}public void start() throws IOException {System.out.println("啟動服務器");while (true){//創建一個DatagramPacket(創建緩存區,緩存區長度)用來接收客戶端發來的請求DatagramPacket datagramPacket=new DatagramPacket(new byte[4096],4096);//客戶端發來的請求放到參數datagramPacket  輸出性參數System.out.println("我正在等待!");socket.receive(datagramPacket);//阻塞等待 客戶端發起請求System.out.println("服務器接收到數據");//把傳來的數據構造成數據 1.獲取數據 從0開始構造 構造到數據結尾String request=new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println("接收到的數據:"+request);//處理業務String requst=process(request);System.out.println("服務器處理數據");//要傳回客戶端也要把數據構造成DatagramPacket//把string構造到byte字節  1.字節數據,2.字節長度 3.客戶端的id+客戶端的端口號DatagramPacket datagramPackets=new DatagramPacket(request.getBytes(),request.getBytes().length,datagramPacket.getSocketAddress());//發送數據socket.send(datagramPackets);System.out.println("服務器發送數據成功");System.out.printf("[地址:%s:端口號:%d] 發來數據:%s 服務器響應數據:%s\n",datagramPacket.getAddress().toString(),datagramPacket.getPort(),request,requst);}}public String process(String s){return s;}public static void main(String[] args) throws IOException {//端口號范圍 0--65535 1024以下的端口是系統用的  盡量用1024以上 65535以下Test1 test1=new Test1(8080);test1.start();}
}

客戶端

1.創建DatagramSocket (這里客戶端端口號系統分配即可,不允許和服務器同一端口號)

DatagramSocket Socket=null;//客戶端端口號需要系統自動分配 不能指定與服務器端口號一樣,不然會搶占服務器端口號 導致后啟動的一端無法啟動public Test2() throws SocketException {Socket=new DatagramSocket();}

2.客戶端接收用戶的數據

Scanner scanner=new Scanner(System.in);System.out.println("客戶端輸入數據:>");String Data=scanner.nextLine();

3.處理用戶數據成DatagramPacket 指定要發送服務器的地址與端口號

//處理用戶數據//1.把string類型處理成byte字節數據 datagramPacket類型 里面附帶發送地址和發送對方的端口號DatagramPacket datagramPacket=new DatagramPacket(Data.getBytes(),Data.getBytes().length, InetAddress.getByName("127.0.0.1"),8080);System.out.println("客戶端處理數據");

4.發送數據給客戶端

 //發送數據Socket.send(datagramPacket);System.out.println("客戶端發送數據");

5.阻塞等待服務器響應

//阻塞等待服務器的響應數據DatagramPacket datagramPackets=new DatagramPacket(new byte[1024],1024);Socket.receive(datagramPackets);System.out.println("客戶端接收服務器響應數據");

6.處理服務器響應的數據

//處理服務器響應的數據String Datas=new String(datagramPackets.getData(),0,datagramPackets.getLength());System.out.println("客戶端處理數據");

7.顯示數據給用戶

System.out.printf("服務器響應數據:%s\n",Datas);

整體代碼

package DemoUDP;import java.io.IOException;
import java.net.*;
import java.util.Scanner;//客戶端
public class Test2 {DatagramSocket Socket=null;//客戶端端口號需要系統自動分配 不能指定與服務器端口號一樣,不然會搶占服務器端口號 導致后啟動的一端無法啟動public Test2() throws SocketException {Socket=new DatagramSocket();}public void start() throws IOException {while (true){//接收用戶數據Scanner scanner=new Scanner(System.in);System.out.println("客戶端輸入數據:>");String Data=scanner.nextLine();//處理用戶數據//1.把string類型處理成byte字節數據 datagramPacket類型 里面附帶發送地址和發送對方的端口號DatagramPacket datagramPacket=new DatagramPacket(Data.getBytes(),Data.getBytes().length, InetAddress.getByName("127.0.0.1"),8080);System.out.println("客戶端處理數據");//發送數據Socket.send(datagramPacket);System.out.println("客戶端發送數據");//阻塞等待服務器的響應數據DatagramPacket datagramPackets=new DatagramPacket(new byte[1024],1024);Socket.receive(datagramPackets);System.out.println("客戶端接收服務器響應數據");//處理服務器響應的數據String Datas=new String(datagramPackets.getData(),0,datagramPackets.getLength());System.out.println("客戶端處理數據");//顯示處理后的數據給用戶System.out.printf("服務器響應數據:%s\n",Datas);}}public static void main(String[] args) throws IOException {Test2 test2=new Test2();test2.start();}
}

繼承服務器代碼,重寫業務代碼即可

package DemoUDP;import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;public class Test3 extends Test1{public Test3(int port) throws SocketException {super(port);}@Overridepublic String process(String s) {Map<String,String> dic=new HashMap<String,String>();dic.put("cat","貓");return dic.getOrDefault(s,"此單詞還未更新");}public static void main(String[] args) throws IOException {Test3 test3=new Test3(8080);test3.start();}}

指定客戶端多開

之后就可以同時運行多個客戶端訪問服務器

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 教程 2.4

MySQL UNION 操作符 本教程為大家介紹 MySQL UNION 操作符的語法和實例。 描述 MySQL UNION 操作符用于連接兩個以上的 SELECT 語句的結果組合到一個結果集合&#xff0c;并去除重復的行。 UNION 操作符必須由兩個或多個 SELECT 語句組成&#xff0c;每個 SELECT 語句的列數…

Python降維數據庫之umap使用詳解

概要 在數據科學和機器學習領域,數據通常是高維度的,而高維度數據不僅難以可視化,還會增加建模的復雜性。降維是一種處理高維數據的關鍵技術,而Python UMAP(Uniform Manifold Approximation and Projection)是一種強大的降維工具,它在保留數據結構的同時,將高維數據映…

uni-app引用外部js文件

全局引用 在App.vue文件中添加如下代碼 這樣在全局所有頁面中都可以直接使用該外部js中的函數 onLaunch: function() {var script document.createElement(script);script.src "https://www.test.com/api/testapi.js";document.body.appendChild(script); }, 單…

【IDEA+通義靈碼插件】實現屬于你的大模型編程助手

目錄 1.前言 2.下載安裝 3.解釋代碼 4.生成單元測試 5.生成注釋 6.智能補全 1.前言 大模型到底該以一種什么方式落地&#xff0c;從而嵌入我們的工作當中&#xff0c;助力我們工作效率的提升&#xff0c;其實最好的方式也許就是虛擬助手的方式&#xff0c;就像鋼鐵俠的&…

【OpenCV基礎(三)】Ubuntu系統下EasyPR環境配置

環境配置 1、資源下載2、環境配置2.1、1、將EasyPR壓縮包拷貝到Ubuntu 三種方法任選一種2.2、解壓得到EasyPR文件夾(文件夾一層進入后EasyPR資源內容)2.3、終端命令修改權限**chmod -R 777 ./ EasyPR**2.4、查找EasyPR/include/easypr/config.h&#xff0c;使用gedit方式打開2.…

uni-app app實現web-view H5圖片長按下載

問題和使用場景描述&#xff1a; uniapp app web-view中圖片無法長按保存&#xff0c;IOS下是正常的&#xff0c;但是Android下長按無反應 解決方案&#xff1a; 下載mui.min.js&#xff0c;放到項目中的static下(下載見最上面的壓縮包) 在static目錄下新建script.js mui.…

vue2本地開發環境正常,生產環境下this.$router.push({ name: ‘login‘ })不跳轉

如果在Vue.js 2中在本地開發環境下正常運行,但在生產環境下使用??this.$router.push({ name: login })??不起作用,可能有幾個原因需要檢查和解決: 路由配置問題: 確保你的路由配置正確,特別是確保在生產環境中,路由的配置和本地開發環境一致。檢查是否正確設置了name…

基于springboot+vue的智能學習平臺系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

SAP PP學習筆記 - 豆知識07 - 如何查看BOM一覽

SAP標準提供了CS03&#xff0c;只能查詢單個的BOM&#xff0c;如果想查看一覽&#xff0c;只能自己寫SQVI 查詢。 有其他高招的童鞋&#xff0c;請賜教啊。 1&#xff0c;SQVI 工具 SAP MM學習筆記18- SQVI 工具_sap sqvi-CSDN博客 輸入查詢名&#xff0c;然后點擊 登錄 2&a…

#QT(DEMO2-登錄界面)

1.IDE&#xff1a;QTCreator 2.實驗&#xff1a;DEMO登錄 3.記錄 Line Edit輸入不換行 密碼框輸入如下設置: 運行效果 4.代碼

Vue.js+SpringBoot開發在線課程教學系統

目錄 一、摘要1.1 系統介紹1.2 項目錄屏 二、研究內容2.1 課程類型管理模塊2.2 課程管理模塊2.3 課時管理模塊2.4 課程交互模塊2.5 系統基礎模塊 三、系統設計3.1 用例設計3.2 數據庫設計 四、系統展示4.1 管理后臺4.2 用戶網頁 五、樣例代碼5.1 新增課程類型5.2 網站登錄5.3 課…

五、西瓜書——集成學習

1.個體與集成 集成學習通過將多個學習器進行結合,常可獲得比單一學習器顯著優越的泛化性能&#xff0c;這對“弱學習器”(weak learner)尤為明顯因此集成學習的很多理論研究都是針對弱學習器進行的而基學習器有時也被直接稱為弱學習器。 要獲得好的集成個體學習器應“好而不同”…

武漢灰京文化:多樣化推廣與創新引領游戲行業

作為專業的游戲推廣服務商&#xff0c;武漢灰京文化注重多樣化的推廣策略&#xff0c;通過與各大媒體、社交平臺和游戲社區建立緊密的合作關系&#xff0c;為游戲企業提供全方位的推廣服務。他們通過精確的廣告投放、內容創作和社交媒體互動等方式&#xff0c;將游戲信息傳播給…

【C++】STL學習之旅——初識STL,認識string類

string類 1 STL 簡介2 STL怎么學習3 STL缺陷4 string4.1 初識 string4.2 初步使用構造函數成員函數 5 小試牛刀Thanks?(&#xff65;ω&#xff65;)&#xff89;謝謝閱讀&#xff01;&#xff01;&#xff01;下一篇文章見&#xff01;&#xff01;&#xff01; 1 STL 簡介 …

解讀OWASP軟件保障成熟度模型SAMM

OWASP軟件保證成熟度模型&#xff08;SAMM&#xff09;可為所有類型的組織分析和改進其軟件安全態勢提供有效和可衡量的方法。OWASP SAMM支持完整的軟件生命周期&#xff0c;包括開發和獲取&#xff0c;并且與技術和過程無關。 1. 簡介 OWASP軟件保證成熟度模型&#xff08;SA…

數據結構 第3章 棧、隊列和數組(一輪習題總結)

第3章 棧、隊列和數組 3.1 棧3.2 隊列3.3 棧與隊列的應用3.4 數組和特殊矩陣 3.1 棧&#xff08;1 10 11 20&#xff09; 3.2 隊列&#xff08;6 12 14 17&#xff09; 3.3 棧與隊列的應用&#xff08;6 11&#xff09; 3.4 數組和特殊矩陣 3.1 棧 T1 棧和隊列具有相同的邏輯…

Java的基本數據類型和引用數據類型

Java的基本數據類型和引用數據類型 Java中的基本數據類型包括整數類型、浮點類型、字符類型和布爾類型&#xff0c;而引用數據類型主要包括類、接口、數組和枚舉。具體介紹如下&#xff1a; 基本數據類型&#xff1a; 整數類型&#xff1a;包括byte、short、int、long&#…

k8s-prometheus監控部署 22

新建項目倉庫并上傳部署prometheus所需的鏡像 開始部署 修改svc訪問方式為LoadBalancer 查看用戶名和密碼 訪問grafana監控頁面 http://192.168.182.103/?????? 修改可視化模板 官方監控模板&#xff1a;https://grafana.com/grafana/dashboards 訪問prometheus監控頁面…

1. vue3-環境準備

1、安裝node.js 如果開發環境上面沒有安裝node.js&#xff0c;需要到node.js官方網站下載node.js。下載安裝后&#xff0c;可以通過npm --version查看nodejs版本 2. 開發工具 開發工具建議使用vscode

知識圖譜1——neo4j

2024年要搞知識圖譜&#xff0c;因此沒有辦法&#xff0c;只能將我之前固守的JDK1.8&#xff0c;升級到JDK21&#xff0c;因為JDK21也是LTS版本&#xff0c;neo4j高版本就不支持JDK8&#xff0c;因此沒有辦法&#xff0c;只有升級了。寫這篇只是一個搭建筆記&#xff0c;我的初…