Java學習|黑馬筆記|Day23】網絡編程、反射、動態代理

【DAY23】

文章目錄

    • 【DAY23】
      • 一.網絡編程
        • 1)三要素
        • 1.1)IP
        • InetAddress類的使用
        • 1.2)端口號
        • 1.3)協議
        • 2.1)UDP協議發送數據
        • 2.2)UDP協議接收數據
        • 2.3)UDP的三種通信方式
        • 3.1)TCP協議的發送和接收
        • 3.2)中文亂碼問題
        • 3.3)三次握手四次揮手
      • 二.反射
        • 1)概述
        • 2)獲取class對象的三種方式
        • 3)反射獲取構造方法
        • 4)反射獲取成員變量
        • 5)反射獲取成員方法
      • 三.動態代理

一.網絡編程

在通信協議下不同計算機上運行的程序,進行的數據傳輸

應用場景:計算機跟計算機之間通過網絡

Java中使用java.net包下的技術輕松開發出常見的網絡應用程序

常見的軟件架構

  • CS:Client/Server 在用戶本地需要下載并安裝客戶端程序,在遠程有一個服務端程序 eg:QQ
    • 優點:畫面精美,用戶體驗好
    • 缺點:需要開發客戶端也需要開發服務端。用戶需要下載和更新
  • BS:Browser/Server 只需要一個瀏覽器,用戶通過不同網址,客戶訪問不同的服務器 eg:淘寶
    • 優點:不需要開發客戶端,只需要頁面+服務端,用戶不需要下載打卡瀏覽器就能使用
    • 缺點:如果應用過大,用戶體驗受到影響
1)三要素

IP:設備在網絡中的地址,是唯一的表示

端口號:應用程序在設備中的唯一表示

協議:數據在網絡中傳輸的規則,常見的協議有UDP,TCP,http,ftp

1.1)IP

互聯網協議地址,上網設備在網絡中的地址是分配給上網設備的數字標簽

分類

  1. IPv4互聯網通信協議第四版

    采用32位地址長度,分為4組,最多只有2^32個IP,2019年11.26全部分配完畢

    可以用局域網解決IP不夠的問題

    在這里插入圖片描述

  2. IPv6互聯網通信協議第六版

    采用128位地址長度,分為8組 ,最多有2^128個IP

在這里插入圖片描述

IPv4的細節

1.分類:公網地址(萬維網使用)和私有地址(區域網使用)

192.168開頭的就是私有地址,范圍為192.168.0.0—192.168.255.255,專門為組織機構內部使用

2.特殊IP地址:127.0.0.1,也可以是localhost:是回送地址也稱本地回送地址,也稱本機IP,永遠只會尋找當前所在本機

常用的CMD

  • ipconfig:查看本機IP地址
  • ping:檢查網絡是否連通
InetAddress類的使用

表示IP地址

方法說明
static InetAddress getByName(String host)確定主機名稱的IP地址,主機名稱可以是機器名稱也可以是IP地址
String getHostName()獲取此IP地址的主機名
String getHostAddress()返回文本顯示的IP地址字符串
public class t1 {public static void main(String[] args) throws UnknownHostException {//1.獲取InetAddress的對象InetAddress address = InetAddress.getByName("LAPTOP-K3EOH2DK");//"設備名"System.out.println(address);//LAPTOP-K3EOH2DK/192.168.1.32String name = address.getHostName();System.out.println(name);//LAPTOP-K3EOH2DKString ip = address.getHostAddress();System.out.println(ip);//192.168.1.32}
}
1.2)端口號

應用程序在設備中唯一的標識

有兩個字節表示的整數,取值范圍:065535,其中01023之間的端口號用于一些知名的網絡訪問或者應用

一個端口號只能被一個應用程序使用

1.3)協議

計算機網絡中連接和通信的規則被稱為網絡通信協議

  • OSI參考模型:世界互聯協議標準,全球通信規范,單模型過于理想化,未能在因特網上進行廣泛推廣
  • TCP/IP參考模型(或TCP/IP協議):事實上的國際標準

在這里插入圖片描述

在這里插入圖片描述

UDP協議

  • 用戶數據報協議
  • UDP是面向無連接通信協議,速度快,有大小限制一次最多發送64K,數據不安全,易丟失數據

TCP協議

  • 傳輸控制協議
  • TCP是面向連接通信協議,速度慢,沒有大小限制,數據安全
2.1)UDP協議發送數據

在這里插入圖片描述

public class t1 {public static void main(String[] args) throws IOException {//1.創建對象//綁定端口號,通過這個端口往外發送//空參:所有可能的端口中隨機一個進行使用//有參:指定端口號進行綁定DatagramSocket ds = new DatagramSocket();//2.打包數據String str = "你好你好你好你好你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("192.168.1.32");int port = 10086;//端口號DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.發送數據ds.send(dp);//4.釋放數據ds.close();}
}
2.2)UDP協議接收數據

在這里插入圖片描述

public class T2 {public static void main(String[] args) throws IOException {//1.創建DatagramSocketDatagramSocket ds = new DatagramSocket(10086);//2.接收數據包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);//3.解析數據包byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到數據" + new String(data,0,len));System.out.println("該數據是從" + address + "這臺電腦中的" + port + "這個接口發出的");//4.釋放數據ds.close();}
}

先運行接收端再運行發送端

2.3)UDP的三種通信方式
  1. 單播

    一對一

  2. 組播

    一對組

    組播地址:224.0.0.0~239.255.255.255 其中224.0.0.0~224.0.0.255為預留的組播地址

  3. 廣播

    一對局域網中的所有設備

    廣播地址:255.255.255.255

組播

public class t1 {public static void main(String[] args) throws IOException {//組播//1.創建對象MulticastSocket ms = new MulticastSocket();//2.打包數據String str = "你好你好你好你好你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;//端口號DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.發送數據ms.send(dp);//4.釋放數據ms.close();}
}
public class T2 {public static void main(String[] args) throws IOException {//1.創建對象MulticastSocket ms = new MulticastSocket(10000);//2.將當前本機添加到224.0.0.1的這一組中InetAddress adress = InetAddress.getByName("224.0.0.1");ms.joinGroup(adress);//3.接收數據包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ms.receive(dp);//4.解析數據包byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到數據" + new String(data,0,len));System.out.println("該數據是從" + address + "這臺電腦中的" + port + "這個接口發出的");//5.釋放數據ms.close();}
}

廣播

public class t1 {public static void main(String[] args) throws IOException {//組播//1.創建對象MulticastSocket ms = new MulticastSocket();//2.打包數據String str = "你好你好你好你好你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("255.255.255.255");int port = 10000;//端口號DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.發送數據ms.send(dp);//4.釋放數據ms.close();}
}
3.1)TCP協議的發送和接收

在這里插入圖片描述

客戶端

  1. 創建客戶端的對象Socket對象(Socket)與自動服務器端連接

    Socket(String host,int port)

  2. 獲取輸出流,寫數據

    OutputStream getOutputStream()

  3. 釋放數據

    void close()

服務器

  1. 創建服務器端的Socket對象(ServerSocket)

    ServerSocket(int port)

  2. 監聽客戶端連接,返回一個Socket對象

    Socket accept()

  3. 獲取輸入流,讀數據,并把數據顯示在控制臺

    InputStream getInputStream()

  4. 釋放資源

    void close()

客戶端

public class t1 {public static void main(String[] args) throws IOException {//1.創建對象Socket socket = new Socket("192.168.1.32",10086);//2.從連接通道中獲取輸出流OutputStream os = socket.getOutputStream();//寫出數據os.write("你好你好你好你好你好".getBytes());//3.釋放數據os.close();socket.close();}
}

服務端

public class T2 {public static void main(String[] args) throws IOException {//1.創建對象ServerSocket ss = new ServerSocket(10086);//2.監聽客戶端的連接Socket socket = ss.accept();//3.從連接通道中獲取輸入流讀取數據InputStream is = socket.getInputStream();int b;while((b = is.read()) != -1) {System.out.println((char)b);}//4.釋放資源socket.close();ss.close();}
}
3.2)中文亂碼問題

亂碼原因:一個中文三個字節,InputStream字節流一個一個字節讀所有造成亂碼

解決方法:用轉換流把字節流轉換為字符流

public class T2 {public static void main(String[] args) throws IOException {//1.創建對象ServerSocket ss = new ServerSocket(10086);//2.監聽客戶端的連接Socket socket = ss.accept();//3.從連接通道中獲取輸入流讀取數據InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);int b;while((b = isr.read()) != -1) {System.out.print((char)b);}//4.釋放資源isr.close()socket.close();ss.close();}
}
3.3)三次握手四次揮手

在這里插入圖片描述

在這里插入圖片描述

二.反射

1)概述

反射允許對封裝類的字段,方法和構造函數的信息進行編程訪問

在這里插入圖片描述

2)獲取class對象的三種方式
  1. Class.forName(“全類名”);

    最常用

  2. 類名.class

    一般更多是當做參數進行傳遞

  3. 類名.getClass();

    當已經有了這個類的對象時才能使用

public class t1 {public static void main(String[] args) throws IOException, ClassNotFoundException {//1.法一//全類名:包名 + 類名Class clazz1 = Class.forName("T1.Student");//2.法二Class clazz2 = Student.class;//3.法三Student s = new Student();Class clazz3 = s.getClass();}
}
3)反射獲取構造方法

在這里插入圖片描述

在這里插入圖片描述

public class t1 {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException {//1.獲取class字節碼文件對象Class clazz = Class.forName("T1.Student");//2.獲取構造方法Constructor[] cons = clazz.getConstructors();for (Constructor con : cons) {System.out.println(con);}Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor con2 : cons2) {System.out.println(con2);}//獲取單個Constructor con1 = clazz.getDeclaredConstructor();System.out.println(con1);Constructor con2 = clazz.getDeclaredConstructor(String.class);System.out.println(con2);}
}
4)反射獲取成員變量

在這里插入圖片描述

public class t1 {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {//1.獲取class字節碼文件對象Class clazz = Class.forName("T1.Student");//2.獲取成員變量Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field);}Field[] fields2 = clazz.getDeclaredFields();for (Field field2 : fields2) {System.out.println(field2);}//獲取單個Field name = clazz.getDeclaredField("name");//獲取權限修飾符int modifiers = name.getModifiers();System.out.println(modifiers);}
}
5)反射獲取成員方法

在這里插入圖片描述

三.動態代理

特點:無侵入式的給代碼增加額外的功能

為什么需要代理對象如果要干的事情太多可以通過代理轉移部分職責

代理長什么樣對象有什么方法想被代理,代理就一定要有相應的方法

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

【Linux】從普通進程到守護進程:系統服務的誕生之路

當你在深夜關閉SSH終端,為何Web服務器仍在默默響應請求?這背后是守護進程的魔法在守護著系統服務的不滅之火。一、守護進程的六大核心特征守護進程(Daemon)是Linux系統的無名英雄,它們舍棄了普通進程的"世俗享受&…

k8s常用基礎命令總結

----------------------k8s常用基礎命令--------------------------------- 獲取 Pod 信息 # 1.獲取k8s的命名空間 kubectl get namespaces ?1)獲取 Pod 列表及簡要信息: kubectl get pods 2)以 YAML 格式獲取 Pod 詳細信息: kubectl get pod -o yaml 3)?獲取特定命名空間中…

Java高級之基于Java Attach與Byte-Buddy實現SQL語句增強

目錄 一 Agent 模塊 1 HookAgent.java 2 FormatAdvice.java 3 配置文件 二 Attacher 模塊 1 AttachMain.java 三 測試模塊 1 DruidTest.java 四 驗證步驟 五 原理解析 筆者目標寫一款數據分析中間件,用來增強當前主流開源項目,前幾天寫了一票用…

2025第五屆生物發酵營養源高峰論壇

一、會議時間會議時間:2025年8月8日二、會議地點上海新國際博覽中心–W4館現場2號會議室三、組織單位主辦單位:中國生物發酵產業協會承辦單位:浙江工業大學樂斯福集團Procelys 樂斯福發酵營養元參會福利,助力高效交流為提升參會體驗,組委會特別推出多項福…

Kubernetes 配置管理

這里寫目錄標題什么是 ConfigMap創建 ConfigMap基于目錄創建 ConfigMap創建 conf 目錄,里面放置兩個文件基于目錄下的所有文件創建 ConfigMap查看當前創建的 ConfigMap基于文件創建 ConfigMap創建測試文件 game-cfg基于單個文件創建 ConfigMap查看當前創建的 Config…

ESP32+MicroPython:用Python玩轉物聯網開發

什么是ESP32? ESP32作為當下最熱門的物聯網開發板,常被比作"嵌入式世界的瑞士軍刀"。但很多初學者會混淆芯片、模組和開發板的概念,其實它們的關系很簡單: 芯片(Soc):核心處理器,如ESP32-D0WD模…

opencv學習(圖像金字塔)

1.什么是圖像金字塔圖像金字塔是一種多尺度圖像表示方法,通過對原始圖像進行下采樣(縮小)和上采樣(放大),生成一系列不同分辨率的圖像集合,形似 “金字塔”(底部是高分辨率原始圖像&…

從 C# 到 Python:項目實戰第五天的飛躍

在前面三天的學習中,我們已經掌握了 Python 的基礎語法、數據結構以及一些核心庫的使用。今天,我們將通過三個實戰項目,深入對比 C# 和 Python 在命令行工具開發、Web 應用開發以及數據處理方面的差異,感受 Python 在實際項目中的…

rabbitmq 03

一、mq的作用和使用場景 MQ的基本作用 MQ(Message Queue,消息隊列)是一種應用程序對應用程序的通信方法,主要作用包括: 異步處理:解耦生產者和消費者,允許生產者發送消息后立即返回&#xff0…

Ubuntu 24.04 顯示中文+使用中文鍵盤

ubuntu 24.04 中文顯示中文鍵盤Ubuntu中文輸入重啟iBus服務Ubuntu中文輸入 安裝的Ubuntu24.04,一般默認是英文的,要使用中文的話,可以通過命令行設置,也可以使用‘設置’,在圖形化界面中操作。 下面是在‘設置’的圖形…

Docker實戰:Tomcat容器從部署到自定義網頁的完整操作

Docker實戰:Tomcat容器從部署到自定義網頁的完整操作 繼Nginx容器部署后,我們再來實操Tomcat容器的使用——從拉取鏡像、啟動容器,到端口映射、網頁掛載,全程通過實際命令演示,帶你掌握Tomcat在Docker中的核心用法。 一…

使用cherry studio離線搭建私人知識庫流程記錄

本篇文章記錄近期嘗試在個人筆記本上、全離線狀態下搭建知識庫的流程。用到的工具包括:Cherry Studio、ollama。主要過程是:首先下載ollama用于管理大模型;然后,從魔塔社區下載需要的deepseek、千問大模型和bge-m3嵌入模型&#x…

【工具類】Linux 環境利用 uv 安裝多版本 python

文章目錄前置工作環境說明如果kali無法訪問網絡pypi 換源安裝 uvuv 寫入環境變量臨時寫入永久寫入無法打開 github 解決方案(注意此方法可能也會失效)安裝多版本 python查看已安裝的pythonuv python install到 uv 的 github 主頁,找安裝文件下…

求職招聘小程序源碼招聘小程序開發定制

身份:求職者、企業求職者:完善簡歷,簡歷投遞企業:企業入駐,查看簡歷企業會員:半年 、年度 權益:每日發布條數、刷新條數,簡歷下載數量聊天:求職者可以和企業聊天招聘會…

Git 使用全指南:從配置到免密登錄

Git 使用全指南:從配置到免密登錄一、Git 基礎配置二、Git 代碼提交流程2.1 克隆遠程倉庫2.2 創建并切換分支2.3 暫存文件2.4 提交到本地倉庫2.5 拉取遠程最新代碼2.6 推送本地分支到遠程三、VSCode 服務器免密登錄配置3.1 生成 Windows SSH 密鑰3.2 復制公鑰到服務…

組合期權:領式策略

文章目錄0.簡介1.多頭領式策略(Long Collar)?1.1 策略構成1.2 適用場景?1.3 損益分析1.4 案例示范2.空頭領式策略(Short Collar)?2.1 策略構成2.2 適用場景2.3 損益分析2.4 案例示范參考文獻0.簡介 領式策略(Colla…

ECSPI控制器

目錄 SPI協議簡介 極性與相位 SPI框圖 單字節收發 發送數據流程 接收數據流程 ECSPI控制器 關鍵特性 時鐘源 主機模式 等待狀態 片選控制 單突發傳輸 多突發傳輸 相位控制 ECSPI Memory Map ECSPI寄存器 ECSPIx_RXDATA ECSPIx_TXDATA ?編輯 ECSPIx_CONREG …

HTTP 與 SpringBoot 參數提交與接收協議方式

HTTP 協議支持多種參數提交方式,主要取決于請求方法(Method)和內容類型(Content-Type)。以下是主要的參數提交協議:1. URL 查詢參數 (Query Parameters)請求方法: GET (也可用于其他方法)格式: ?key1value1&key2value2示例: GET /users?id123&…

Lua(數組)

Lua 數組基礎概念Lua 中的數組實際上是用整數索引的 table,是一種特殊形式的表。數組索引通常從 1 開始(Lua 慣例),但也可以從其他值開始。創建數組通過表構造器初始化數組:-- 索引從 1 開始的數組 local arr {10, …

【Docker項目實戰】在Docker環境下部署go-file文件分享工具

【Docker項目實戰】在Docker環境下部署go-file文件分享工具一、go-file介紹1.1 go-file簡介1.2 go-file特點1.3 go-file使用場景二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本四、下…