【JAVA基礎之網絡編程】UDP和TCP協議以及三次握手和四次揮手的過程

🔥作者主頁:小林同學的學習筆錄

🔥mysql專欄:小林同學的專欄

目錄

1. 網絡編程

1.1? 概述

1.2? 網絡編程的三要素

1.2.1? IP地址

1.2.2? InetAddress

1.2.3? 端口和協議

1.3? UDP協議

1.3.1? UDP發送數據

1.3.2? UDP接收數據

1.4? TCP協議

1.4.1? TCP協議實例

1.4.2? 三次握手,四次揮手


1. 網絡編程

1.1? 概述

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

java.net包中可以看見常見的網絡應用程序API

常見的軟件架構:

C/S:Client / Server? ?客戶端 / 服務器

  • 需要用戶下載并安裝客戶端程序,在遠程有一個服務器程序
  • 優缺點:
    • 畫面可以做的比較精美,用戶體驗好(不需要網絡傳輸,數據來源于安裝包)
    • 需要開發客戶端,也需要開發服務端
    • 用戶需要下載和更新的時候太麻煩?

B/S:Browser / Server? 瀏覽器 /? 服務器

  • 只需要一個瀏覽器,通過訪問不同的網址實現操作程序,客戶訪問不同的服務器
  • 優缺點:
    • 不需要開發客戶端,只需要頁面 + 服務器
    • 用戶不需要下載,打開瀏覽器就能使用
    • 如果應用過大,用戶體驗將受到影響(因為數據進行網絡傳輸效率比較低)

1.2? 網絡編程的三要素

IP:設備在網絡中的地址,是唯一標識

端口號:應用程序在設備中的唯一標識

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

1.2.1? IP地址

IP地址分為兩大類:

  • IPv4:是給每個連接在網絡上的主機分配一個32bit地址。按照TCP/IP規定,IP地址用二進制來表示,每個IP地址長32bit,也就是4個字節。例如一個采用二進制形式的IP地址是“11000000 10101000 00000001 01000010”,這么長的地址,處理起來也太費勁了。為了方便使用,IP地址經常被寫成十進制的形式,中間使用符號“.”分隔不同的字節。于是,上面的IP地址可以表示為“192.168.1.66”。IP地址的這種表示法叫做“點分十進制表示法”,這顯然比1和0容易記憶得多,最多有2^32次方個IP

  • IPv6:由于互聯網的蓬勃發展,IP地址的需求量愈來愈大,但是網絡地址資源有限,使得IP的分配越發緊張。為了擴大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個字節一組,分成8組十六進制數,每一組用分號隔開,這樣就解決了網絡地址資源數量不夠的問題,最多有2^128次方個IP、

DOS常用命令:

  • ipconfig:查看本機IP地址

  • ping IP地址:檢查網絡與目標主機是否能連通

特殊IP地址:

  • 127.0.0.1:是回送地址,可以代表本機地址LocalHost,一般用來測試使用

疑問:假設192.168.1.100是我的電腦IP,那么這個IP跟127.0.0.1是一樣嗎?

不一樣,192.168.1.100和127.0.0.1不是一樣的IP地址。192.168.1.100是局域網內的私有IP地址,用于在局域網中標識設備。而127.0.0.1是本地回環地址,用于在同一臺設備內部進行通信。當你的計算機嘗試連接127.0.0.1時,它實際上是在嘗試與自己通信,而不是與網絡上的其他設備通信。

疑問:公網地址(萬維網使用)和私有地址(局域網使用)的區別?

公網地址和私有地址之間的主要區別在于它們的可訪問性和范圍。公網地址是全球唯一的IP地址,用于在互聯網上唯一標識設備和進行通信。私有地址則是在局域網內使用的地址,不會在互聯網上進行路由,因此不能直接從互聯網上訪問。私有地址用于在局域網內部進行通信,而通過路由器進行網絡地址轉換(NAT),可以允許多個設備共享單個公網IP地址來訪問互聯網。

1.2.2? InetAddress

InetAddress?是 Java 編程語言中用于表示 IP 地址的類。它提供了一種將 IP 地址和主機名相互轉換的方式。通過?InetAddress?類,可以實現網絡通信中的主機名解析、IP 地址解析等功能。

成員方法:

1.2.3? 端口和協議

  • 端口

    • 設備上應用程序的唯一標識

  • 端口號

    • 用兩個字節表示的整數,它的取值范圍是0~65535。其中,0~1023之間的端口號用于一些知名的網絡服務和應用,普通的應用程序需要使用1024以上的端口號。如果端口號被另外一個服務或應用所占用,會導致當前程序啟動失敗

  • 協議

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

  • UDP協議

    • 用戶數據報協議(User Datagram Protocol)

    • UDP是無連接通信協議,即在數據傳輸時,數據的發送端和接收端不建立邏輯連接。簡單來說,當一臺計算機向另外一臺計算機發送數據時,發送端不會確認接收端是否存在,就會發出數據,同樣接收端在收到數據時,也不會向發送端反饋是否收到數據。

    • 由于使用UDP協議消耗系統資源小,通信效率高,所以通常都會用于音頻、視頻和普通數據的傳輸

    • 速度快,有大小限制一次最多發送64K,數據不安全,易丟失數據

    • 例如視頻會議通常采用UDP協議,因為這種情況即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。但是在使用UDP協議傳送數據時,由于UDP的面向無連接性,不能保證數據的完整性,因此在傳輸重要數據時不建議使用UDP協議

  • TCP協議

    • 傳輸控制協議 (Transmission Control Protocol)

    • TCP協議是面向連接的通信協議,即傳輸數據之前,在發送端和接收端建立邏輯連接,然后再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手”

    • 速度慢,沒有大小限制,數據安全

    • 三次握手:TCP協議中,在發送數據的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠

      第一次握手,客戶端向服務器端發出連接請求,等待服務器確認

      第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求

      第三次握手,客戶端再次向服務器端發送確認信息,確認連接

    • 完成三次握手,連接建立后,客戶端和服務器就可以開始進行數據傳輸了。由于這種面向連接的特性,TCP協議可以保證傳輸數據的安全,所以應用十分廣泛。例如上傳文件、下載文件、瀏覽網頁等

1.3? UDP協議

1.3.1? UDP發送數據

構造方法:

成員方法:

發送數據的步驟

  • 創建發送端的Socket對象(DatagramSocket)

  • 創建數據,并把數據打包(DatagramPacket)

  • 調用DatagramSocket對象的方法發送數據(send)

  • 關閉發送端

代碼演示:

public class Send {public static void main(String[] args) throws IOException {/*** 創建發送端的Socket對象(DatagramSocket)* 創建數據,并把數據打包(DatagramPacket)* 調用DatagramSocket對象的方法發送數據(send)* 關閉發送端*///這里參數如果沒有端口號,系統會自動分配一個端口號DatagramSocket socket = new DatagramSocket(10000);String str = "龍顏大怒666";byte[] bytes = new byte[1024];bytes = str.getBytes();DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("127.0.0.1"),10086);socket.send(packet);socket.close();}
}

1.3.2? UDP接收數據

構造方法:

成員方法:

接收數據的步驟

  • 創建接收端的Socket對象(DatagramSocket)

  • 創建一個數據包,用于接收數據(DatagramPacket)

  • 調用DatagramSocket對象的方法接收數據(receive)

  • 解析數據包,并把數據在控制臺顯示

  • 關閉接收端

代碼演示:

public class Receive {public static void main(String[] args) throws IOException {/*** 創建接收端的Socket對象(DatagramSocket)* 創建一個數據包,用于接收數據(DatagramPacket)* 調用DatagramSocket對象的方法接收數據(receive)* 解析數據包,并把數據在控制臺顯示* 關閉接收端*///注意:這里的端口號一定要與發送端中的數據包端口一致,不然會收不到數據DatagramSocket socket = new DatagramSocket(10086);byte[] bytes = new byte[1024];DatagramPacket packet = new DatagramPacket(bytes,bytes.length);//這個方法會一直等待發送端發送信息過來,直到拿到數據才會取消阻塞socket.receive(packet);byte[] data = packet.getData();InetAddress address = packet.getAddress();int port = packet.getPort();System.out.println("數據:" + new String(data,0,packet.getLength()) + " 主機IP:" + address + " 端口號:" + port);socket.close();}
}輸出結果:數據:龍顏大怒666 主機IP:/127.0.0.1 端口號:10000

1.4? TCP協議

1.4.1? TCP協議實例

代碼演示:

public class Client {public static void main(String[] args) throws IOException {//創建socket對象//細節:在創建對象同時會連接服務端//如果連接不上代碼會報錯Socket socket = new Socket("127.0.0.1",10000);//創建socket的輸出流通道OutputStream outputStream = socket.getOutputStream();//寫入數據outputStream.write("你好呀".getBytes());//關閉資源socket.close();outputStream.close();}
}
public class Server {public static void main(String[] args) throws IOException {//這里的端口號要跟客戶端的Socket保持一致ServerSocket serverSocket = new ServerSocket(10000);//這里會阻塞等待客戶端發送信息Socket socKet = serverSocket.accept();//通過socket獲取輸入流通道InputStream inputStream = socKet.getInputStream();//解決中文亂碼問題InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);int len;while ((len = bufferedReader.read()) != -1) {System.out.print((char) len);}//關閉資源serverSocket.close();socKet.close();}
}

1.4.2? 三次握手,四次揮手

三次握手:為了確保連接的建立

四次揮手:確保連接斷開,且數據處理完畢

1.5? 綜合練習

1.5.1? 多發多送

public class Test01 {public static void main(String[] args) throws IOException {/*** 客戶端:多次發送數據* 服務端:接收多次數據,并打印*/Socket socket = new Socket("127.0.0.1",10002);OutputStream outputStream = socket.getOutputStream();Scanner scanner = new Scanner(System.in);while (true) {System.out.println("請輸入你要發送的信息:");String str = scanner.nextLine();//用戶輸入886表示退出if("886".equals(str)){break;}outputStream.write(str.getBytes());}//關閉資源outputStream.close();socket.close();}
}public class TestServer01 {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10002);Socket socket = serverSocket.accept();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));int len;while((len = bufferedReader.read()) != -1){System.out.print((char)len);}//關閉資源socket.close();serverSocket.close();}
}

1.5.2? 接收并反饋

public class Test02 {public static void main(String[] args) throws IOException {/*** 客戶端:發送一條數據,接收服務端反饋的消息并打印* 服務端:接收數據并打印,再給客戶端反饋信息*/Socket socket = new Socket(InetAddress.getLocalHost(),10003);Scanner scanner = new Scanner(System.in);OutputStream os = socket.getOutputStream();System.out.println("請輸入要發給服務端的信息:");String str = scanner.nextLine();os.write(str.getBytes());//細節:這里需要一個結束標記,服務端那邊讀取才知道結束socket.shutdownOutput();InputStreamReader isr = new InputStreamReader(socket.getInputStream());int len;while ((len = isr.read()) != -1){System.out.print((char)len);}socket.close();}
}public class TestServer02 {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10003);Socket socket = serverSocket.accept();InputStreamReader isr = new InputStreamReader(socket.getInputStream());int len;//細節://read方法從連接通道讀取數據//但是需要一個結束標記循環才會停止//否則,程序就會一直停在read方法這里,等待讀取下面的數據while ((len = isr.read()) != -1){System.out.print((char)len);}OutputStream os = socket.getOutputStream();os.write("收到客戶端的信息".getBytes());socket.close();serverSocket.close();}
}

1.5.3? 上傳練習

public class Test03 {public static void main(String[] args) throws IOException {/*** 案例需求:* 客戶端:數據來自于本地文件,接收服務器反饋* 服務器:接收到的數據寫入本地文件,給出反饋*/Socket socket = new Socket("127.0.0.1", 10000);byte[] bytes = new byte[1024];int len;//這種方式效率比較低//FileInputStream fis = new FileInputStream("D:\\img\\0a3b3288-3446-4420-bbff-f263d0c02d8e.jpg");//OutputStream os = socket.getOutputStream();//緩存流可以降低磁盤IO次數BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source/0a3b3288-3446-4420-bbff-f263d0c02d8e.jpg"));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());//發送數據while ((len = bis.read(bytes)) != -1){bos.write(bytes,0,len);}//設置結束標記socket.shutdownOutput();//接收數據InputStreamReader isr = new InputStreamReader(socket.getInputStream());while ((len = isr.read()) != -1){System.out.print((char)len);}socket.close();}
}public class TestServer03 {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10000);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();byte[] bytes = new byte[1024];int len;//效率低//FileOutputStream fos = new FileOutputStream(new File("D:\\test\\a.jpg"));//這里需要解決文件名重復問題,導致原先的文件會被后面的覆蓋,用UUID來解決//System.out.println(UUID.randomUUID());//72e165ae-98ad-4cd4-80e9-c9f86b910461,我們一般看到的效果是沒有"-"的,需要處理一下String name = UUID.randomUUID().toString().replace("-", "");//BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("img\\a.jpg"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("img\\" + name + ".jpg"));//邊讀邊寫while((len = is.read(bytes)) != -1){bos.write(bytes,0,len);}//發送數據OutputStream os = socket.getOutputStream();os.write("收到數據啦".getBytes());socket.close();serverSocket.close();}
}

1.5.4? 服務器改寫成多線程,以及線程優化

服務器只能處理一個客戶端請求,接收完一個圖片之后,服務器就關閉了。

優化方案一:使用循環

弊端:第一個用戶正在上傳數據,第二個用戶就來訪問了,此時第二個用戶是無法成功上傳的。

所以,使用多線程改進

優化方案二:使用循環 + 多線程

每來一個用戶,就開啟多線程處理

public class Test04 {public static void main(String[] args) throws IOException {/*** 案例需求:* 客戶端:數據來自于本地文件,接收服務器反饋* 服務器:接收到的數據寫入本地文件,給出反饋*/Socket socket = new Socket("127.0.0.1", 10000);byte[] bytes = new byte[1024];int len;//這種方式效率比較低//FileInputStream fis = new FileInputStream("D:\\img\\0a3b3288-3446-4420-bbff-f263d0c02d8e.jpg");//OutputStream os = socket.getOutputStream();//緩存流可以降低磁盤IO次數BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source/0a3b3288-3446-4420-bbff-f263d0c02d8e.jpg"));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());//發送數據while ((len = bis.read(bytes)) != -1){bos.write(bytes,0,len);}//設置結束標記socket.shutdownOutput();//接收數據InputStreamReader isr = new InputStreamReader(socket.getInputStream());while ((len = isr.read()) != -1){System.out.print((char)len);}socket.close();}
}public class TestServer04 {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10000);ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3,//核心線程數量16,//線程池總大小60,//空閑時間TimeUnit.SECONDS,//空閑時間(單位)new ArrayBlockingQueue<>(2),//隊列Executors.defaultThreadFactory(),//線程工廠,讓線程池如何創建線程對象new ThreadPoolExecutor.AbortPolicy()//阻塞隊列);while (true) {//等待客戶端連接Socket socket = serverSocket.accept();//一個用戶對應一條線程//new Thread(new MyRunnable(socket)).start();//線程池進行優化poolExecutor.submit(new MyRunnable(socket));}}
}public class MyRunnable implements Runnable {private Socket socket;public MyRunnable(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();byte[] bytes = new byte[1024];int len;//效率低//FileOutputStream fos = new FileOutputStream(new File("D:\\test\\a.jpg"));//這里需要解決文件名重復問題,導致原先的文件會被后面的覆蓋,用UUID來解決//System.out.println(UUID.randomUUID());//72e165ae-98ad-4cd4-80e9-c9f86b910461,我們一般看到的效果是沒有"-"的,需要處理一下String name = UUID.randomUUID().toString().replace("-", "");//BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("img\\a.jpg"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("img\\" + name + ".jpg"));//邊讀邊寫while ((len = is.read(bytes)) != -1) {bos.write(bytes, 0, len);}//發送數據OutputStream os = socket.getOutputStream();os.write("上傳成功".getBytes());} catch (IOException e) {throw new RuntimeException(e);} finally {if (socket != null) {try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}}

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

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

相關文章

C語言——小知識和小細節18

一、力扣題目 1、題目本體 2、題解 本題目我們使用異或分組的方法來解決。可以在我之前的文章《C語言——操作符CSDN博客》中看一下異或的特點。 由于異或的運算規則為相同為0&#xff0c;不同為1&#xff0c;而且是在二進制補碼上進行操作的&#xff0c;我們可以發現的一個…

c++|多態

c|多態 1 多態的概念2 多態的定義及其實現2.1 滿足多態的條件2.2 虛函數2.3 虛函數的重寫2.4 析構函數適合加virtural嗎2.4 C11 override 和 final2.5 三個概念的對比 3 多態的原理4 抽象類4.1 概念4.2 純虛函數 1 多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是…

2413. 最小偶倍數

題目&#xff1a; 給你一個正整數 n &#xff0c;返回 2 和 n 的最小公倍數&#xff08;正整數&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;n 5 輸出&#xff1a;10 解釋&#xff1a;5 和 2 的最小公倍數是 10 。 示例 2&#xff1a; 輸入&#xff1a;n 6 輸出&a…

JS 手寫 節流throttle 防抖debounce函數

防抖debounce // 手寫防抖 function debounce(fn, delay 200) {// timer 在閉包中let timer null// 返回一個函數return function(...args) {if (timer) {clearTimeout(timer) // 清空上次的值}timer setTimeout(() > {fn.apply(this, args) // 透傳 this 和函數參數},…

【再探】設計模式—代理模式

代理是指授權代理人在一定范圍內代表其向第三方進行處理有關事務。 1 代理模式 需求&#xff1a;1&#xff09;將業務代碼與非業務代碼分離&#xff0c;在不改變代碼結構的基礎上&#xff0c;為其添加新的功能。2&#xff09;為系統中的某些操作做同一處理&#xff0c;例如進…

[實例] Unity Shader 逐像素漫反射與半蘭伯特光照

漫反射光照是Unity中最基本最簡單的光照模型&#xff0c;本篇將會介紹在片元著色器中實現反射效果&#xff0c;并會采用半蘭伯特光照技術對其進行改進。 1. 逐頂點光照與逐像素光照 在Unity Shader中&#xff0c;我們可以有兩個地方可以用來計算光照&#xff1a;在頂點著色器…

數據結構:帶頭雙向循環鏈表

目錄 前言 鏈表實現 1.定義節點 2.接口實現 1.開辟新節點 2.初始化 3.打印鏈表 4.添加節點 頭插 尾插 在pos位置之前增加節點 5.刪除節點 判空 頭刪 尾刪 刪除pos位置的節點 6.查找 7.釋放 前言 帶頭雙向循環鏈表的結構最復雜&#xff0c;一般用在單獨存儲數…

z3-加法器實驗

補碼器加減法&#xff0c;運算方法簡介 我們要知道什么是補碼的加法&#xff0c;我們為什么要用補碼的加法&#xff1f; 補碼的加法其實就是將兩個補碼形式的二進制數字直接相加&#xff0c;處理的時候忽略超出固定位數的進位。補碼的加法運算和無符號二進制數的加法操作一樣&…

【最新區塊鏈論文錄用資訊】CCF A — SP 2024 共17篇

Conference&#xff1a;45th IEEE Symposium onSecurity and Privacy CCF level&#xff1a;CCF A Categories&#xff1a;網絡與信息安全 Year&#xff1a;2024 Num&#xff1a;17 Efficient Zero-Knowledge Arguments For Paillier Cryptosystem Paillier 加密系統的有效…

基于python的網頁自動刷新工具

1.下載webdriver https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix122.0.2365.59/下載Edge的瀏覽器驅動 2.安裝selenium pip install selenium4.11.1 3.寫代碼 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox import thr…

【halcon】set_part 實現平移和縮放 徹悟版

背景 之前寫了一篇關于set_part 的文章 &#xff0c;確實也實現了平移和縮放。平移是對的&#xff0c;但是縮放其實有畸變。這個問題一直都困擾著我&#xff0c;知道昨天連續測試了好幾個小時&#xff0c;直到晚上11點終于完美解決。 坐標和高寬 坐標 再講set_part 之前&am…

免費擼gpt-4o和各種大模型實用經驗分享

項目 Github: https://github.com/MartialBE/one-api 先貼兩張圖&#xff1a; 說明 免費擼AI大模型,各位可以對照下面我給出的大模型記錄表來填&#xff0c;key需要自己去拿&#xff0c;國內都需要手機號驗證&#xff0c;如果你不介意。另外我在自己的博客放出免費API給大家…

模型評價指標筆記:混淆矩陣+F1+PR曲線+mAP

評價指標 二分類評價指標 混淆矩陣 TP: 正確預測為了正樣本&#xff0c;原來也是正樣本 FN: 錯誤的預測為負樣本&#xff0c;原來是正樣本 (漏報&#xff0c;沒有找到正確匹配的數目) FP: 錯誤的預測為正樣本&#xff0c;原來是負樣本 (誤報&#xff0c;沒有的匹配不正確) TN…

CIM模型

CIM 是 Esri 制圖信息模型。 它是一個地圖內容規范,用于記錄在保存、讀取、引用或打開時如何永久保留描述不同項目組件的信息。 該規范以 JSON 表示,適用于 ArcGIS 應用程序和 API 中的地圖、場景、布局、圖層、符號和樣式。 CIM 不僅限于制圖設置。 要了解屬性的組織方式以及…

【Tools】SpringBoot工程中,對于時間屬性從后端返回到前端的格式問題

Catalog 時間屬性格式問題一、需求二、怎么使用 時間屬性格式問題 一、需求 對于表中時間字段&#xff0c;后端創建對應的實體類的時間屬性需要設定格式&#xff08;默認的格式不方便閱讀&#xff09;&#xff0c;再返回給前端。 二、怎么使用 導入jackson相關的坐標&#x…

Vue.js - Vue 的安裝 以及 常用的 Vue 指令 【0基礎向 Vue 基礎學習】

文章目錄 Vue 快速上手1、Vue.js 官網 & Vue.js 的獲取2、創建 Vue 實例&#xff0c;初始化渲染3、插值表達式 安裝 Vue 開發者工具&#xff1a;裝插件調試 Vue 應用Vue 指令1、v-show 指令2、v-if3、v-else & v-else-if4、v-onv-on 調用傳參 5、v-bindv-bind 對于樣式…

【算法】前綴和算法——和為k的子數組之和

題解&#xff1a;和為k的子數組之和(前綴和算法) 目錄 1.題目2.題解思路2.1前綴和 哈希表&#xff0c;算法步驟&#xff1a;2.2細節如下&#xff1a;2.3參考代碼&#xff1a; 3.總結及思考 1.題目 題目鏈接&#xff1a;LINK 2.題解思路 暴力求解自然不用多說&#xff0c;時…

【SQL】外連接 LEFT JOIN

目錄 一.內連接與外連接 1.內連接&#xff08;inner join&#xff09; 2.外連接&#xff08;outer join&#xff09; 二.兩表連接 1.我們先來試試看內連接&#xff1a; 2.我們再來試試外連接 三.單表外連接 四.總結 一.內連接與外連接 先得介紹內連接和外連接兩個概念&…

第199題|關于函數的周期性問題|函數強化訓練(六)|武忠祥老師每日一題 5月24日

解題思路&#xff1a;解這道題我們要用到下面這個結論 f(x)連續&#xff0c;以T為周期時&#xff0c;原函數以T為周期的充分必要條件是&#xff1a; (A) sin x顯然是以π為周期的&#xff0c;我們可以看到并不等于0,根據結論&#xff0c;A的原函數顯然不是周期函數。 (B) 的…