高級06-Java網絡編程:從Socket到HTTP

引言:Java 網絡編程的重要性

隨著互聯網技術的飛速發展,網絡編程已成為現代軟件開發中不可或缺的一部分。Java 作為一種廣泛應用于企業級開發和分布式系統的編程語言,提供了強大的網絡通信支持。從底層的 Socket 編程到高層的 HTTP 協議處理,Java 提供了豐富的 API 和類庫,使得開發者能夠輕松構建網絡應用程序。

本篇文章將深入探討 Java 網絡編程的核心概念,涵蓋從基礎的 Socket 編程到高級的 HTTP 通信,包括 TCP、UDP、HTTP 客戶端與服務器的實現、多線程服務器設計、SSL/TLS 安全通信、RESTful API 調用等內容。通過大量的代碼示例,我們將幫助讀者理解 Java 網絡編程的核心原理,并掌握如何構建高效、穩定的網絡應用。

一、Java 網絡編程基礎

1.1 網絡編程概述

網絡編程是指通過計算機網絡進行數據交換和通信的過程。Java 提供了 java.net 包,其中包含了用于網絡通信的核心類,如 SocketServerSocketURLURLConnection 等。

Java 網絡編程主要基于兩種協議:

  • TCP(Transmission Control Protocol):面向連接的協議,提供可靠的數據傳輸。
  • UDP(User Datagram Protocol):無連接的協議,適用于對速度要求較高但對可靠性要求較低的場景。

1.2 IP 地址與端口

在網絡通信中,每臺計算機都有一個唯一的 IP 地址,用于標識網絡中的設備。IP 地址可以是 IPv4(如 192.168.0.1)或 IPv6(如 2001:db8::1)。

端口(Port)是一個 16 位的數字,用于標識計算機上的特定服務。例如,HTTP 服務通常使用端口 80,HTTPS 使用 443,FTP 使用 21。

在 Java 中,InetAddress 類用于表示 IP 地址:

import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressExample {public static void main(String[] args) {try {// 獲取本地主機的 IP 地址InetAddress localHost = InetAddress.getLocalHost();System.out.println("本地主機名:" + localHost.getHostName());System.out.println("本地 IP 地址:" + localHost.getHostAddress());// 獲取指定域名的 IP 地址InetAddress address = InetAddress.getByName("www.google.com");System.out.println("www.google.com 的 IP 地址:" + address.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}
}

二、Socket 編程基礎

2.1 什么是 Socket?

Socket 是網絡通信的端點,它允許程序在不同主機之間進行數據交換。Java 提供了 SocketServerSocket 類來實現 TCP 通信。

2.2 TCP 通信模型

TCP 是面向連接的協議,通信雙方需要先建立連接,然后才能進行數據傳輸。

2.2.1 TCP 服務器端
import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("服務器已啟動,等待客戶端連接...");// 等待客戶端連接Socket socket = serverSocket.accept();System.out.println("客戶端已連接");// 獲取輸入流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = in.readLine();System.out.println("收到客戶端消息:" + message);// 發送響應BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));out.write("Hello from server");out.newLine();out.flush();// 關閉連接socket.close();} catch (IOException e) {e.printStackTrace();}}
}
2.2.2 TCP 客戶端
import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8888)) {System.out.println("已連接到服務器");// 發送消息BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));out.write("Hello from client");out.newLine();out.flush();// 接收響應BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String response = in.readLine();System.out.println("服務器響應:" + response);// 關閉連接socket.close();} catch (IOException e) {e.printStackTrace();}}
}

2.3 UDP 通信模型

UDP 是無連接的協議,適用于實時性要求較高的場景,如視頻會議、在線游戲等。

2.3.1 UDP 服務器端
import java.net.*;public class UDPServer {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket(9999)) {byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);System.out.println("UDP 服務器已啟動,等待數據...");// 接收數據socket.receive(packet);String message = new String(packet.getData(), 0, packet.getLength());System.out.println("收到客戶端消息:" + message);// 發送響應String response = "Hello from UDP server";byte[] responseData = response.getBytes();DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, packet.getAddress(), packet.getPort());socket.send(responsePacket);} catch (IOException e) {e.printStackTrace();}}
}
2.3.2 UDP 客戶端
import java.net.*;public class UDPClient {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket()) {String message = "Hello from UDP client";byte[] sendData = message.getBytes();// 發送數據InetAddress address = InetAddress.getByName("localhost");DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, 9999);socket.send(sendPacket);// 接收響應byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("服務器響應:" + response);} catch (IOException e) {e.printStackTrace();}}
}

三、多線程服務器設計

在實際應用中,一個服務器需要同時處理多個客戶端的連接請求。為了提高并發性能,我們可以使用多線程技術來實現多客戶端支持。

3.1 多線程 TCP 服務器

import java.io.*;
import java.net.*;public class MultiThreadedTCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8888)) {System.out.println("多線程 TCP 服務器已啟動...");while (true) {Socket socket = serverSocket.accept();System.out.println("新客戶端已連接");// 為每個客戶端創建一個線程new ClientHandler(socket).start();}} catch (IOException e) {e.printStackTrace();}}static class ClientHandler extends Thread {private Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String message;while ((message = in.readLine()) != null) {System.out.println("收到客戶端消息:" + message);// 發送響應out.write("Echo: " + message);out.newLine();out.flush();}socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

3.2 多線程客戶端

import java.io.*;
import java.net.*;public class MultiThreadedTCPClient {public static void main(String[] args) {for (int i = 0; i < 5; i++) {new Thread(() -> {try (Socket socket = new Socket("localhost", 8888)) {BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = "Hello from client";out.write(message);out.newLine();out.flush();String response = in.readLine();System.out.println("服務器響應:" + response);} catch (IOException e) {e.printStackTrace();}}).start();}}
}

四、HTTP 通信基礎

4.1 HTTP 協議簡介

HTTP(HyperText Transfer Protocol)是用于 Web 瀏覽器和服務器之間通信的協議。HTTP 是基于 TCP 的應用層協議,采用請求-響應模式進行通信。

HTTP 請求的基本結構包括:

  • 方法:GET、POST、PUT、DELETE 等
  • URL:請求的資源路徑
  • HTTP 版本:如 HTTP/1.1
  • 請求頭:包含元數據(如 HostUser-Agent 等)
  • 請求體(可選):如 POST 請求中的數據

HTTP 響應的基本結構包括:

  • 狀態碼:如 200(OK)、404(Not Found)
  • 狀態消息:描述狀態碼的文本
  • 響應頭:如 Content-TypeContent-Length
  • 響應體:如 HTML 頁面內容

4.2 使用 Java 發送 HTTP 請求

Java 提供了 HttpURLConnection 類來發送 HTTP 請求。

4.2.1 GET 請求
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpGetExample {public static void main(String[] args) {try {URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");// 獲取響應碼int responseCode = connection.getResponseCode();System.out.println("響應碼:" + responseCode);// 讀取響應BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("響應內容:" + response.toString());} catch (Exception e) {e.printStackTrace();}}
}
4.2.2 POST 請求
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpPostExample {public static void main(String[] args) {try {URL url = new URL("https://jsonplaceholder.typicode.com/posts");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");connection.setDoOutput(true);// 設置請求頭connection.setRequestProperty("Content-Type", "application/json");// 發送請求體String jsonInputString = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";try (OutputStream os = connection.getOutputStream()) {byte[] input = jsonInputString.getBytes("utf-8");os.write(input, 0, input.length);}// 讀取響應BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("響應內容:" + response.toString());} catch (Exception e) {e.printStackTrace();}}
}

4.3 使用 Apache HttpClient 發送 HTTP 請求

Apache HttpClient 是一個功能強大的第三方庫,提供了更簡潔的 HTTP 請求方式。

4.3.1 添加 Maven 依賴
<dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.1</version>
</dependency>
4.3.2 GET 請求
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.io.entity.EntityUtils;public class ApacheHttpGetExample {public static void main(String[] args) throws Exception {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");ClassicHttpResponse response = httpClient.execute(request);System.out.println("響應碼:" + response.getCode());System.out.println("響應內容:" + EntityUtils.toString(response.getEntity()));}}
}
4.3.3 POST 請求
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.io.entity.StringEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;public class ApacheHttpPostExample {public static void main(String[] args) throws Exception {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpPost request = new HttpPost("https://jsonplaceholder.typicode.com/posts");// 設置請求體String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";request.setEntity(new StringEntity(json));request.setHeader("Content-Type", "application/json");ClassicHttpResponse response = httpClient.execute(request);System.out.println("響應碼:" + response.getCode());System.out.println("響應內容:" + EntityUtils.toString(response.getEntity()));}}
}

五、構建 HTTP 服務器

5.1 使用 Java 構建簡單的 HTTP 服務器

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;public class SimpleHttpServer {public static void main(String[] args) throws IOException {HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);server.createContext("/hello", exchange -> {String response = "Hello from HTTP Server";exchange.sendResponseHeaders(200, response.length());OutputStream os = exchange.getResponseBody();os.write(response.getBytes());os.close();});server.setExecutor(null); // creates a default executorserver.start();System.out.println("HTTP 服務器已啟動,端口 8000");}
}

5.2 使用 Spring Boot 構建 RESTful Web 服務

Spring Boot 提供了強大的 Web 開發支持,可以快速構建 RESTful API。

5.2.1 創建 Spring Boot 項目

使用 Spring Initializr 創建一個 Spring Boot 項目,添加 Spring Web 依賴。

5.2.2 編寫 REST 控制器
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api")
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello from Spring Boot!";}@PostMapping("/echo")public String echo(@RequestBody String message) {return "You said: " + message;}
}
5.2.3 啟動應用
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

訪問 http://localhost:8080/api/hello 將返回 Hello from Spring Boot!,使用 Postman 或 curl 發送 POST 請求到 /api/echo 可以測試消息回顯功能。

六、SSL/TLS 安全通信

在現代網絡通信中,安全傳輸數據至關重要。SSL/TLS 協議可以確保數據在傳輸過程中不被竊取或篡改。

6.1 使用 HTTPS 發送請求

import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;public class HttpsGetExample {public static void main(String[] args) {try {URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();System.out.println("響應碼:" + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("響應內容:" + response.toString());} catch (Exception e) {e.printStackTrace();}}
}

6.2 配置 SSLContext

在某些情況下,我們需要自定義 SSL 上下文,例如忽略證書驗證或使用自簽名證書。

import javax.net.ssl.*;
import java.security.cert.X509Certificate;public class CustomSSLContext {public static void main(String[] args) throws Exception {// 創建信任所有證書的 TrustManagerTrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(X509Certificate[] certs, String authType) {}public void checkServerTrusted(X509Certificate[] certs, String authType) {}}};// 初始化 SSLContextSSLContext sslContext = SSLContext.getInstance("SSL");sslContext.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);// 發送 HTTPS 請求URL url = new URL("https://self-signed.badssl.com/");HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("響應內容:" + response.toString());}
}

七、總結

Java 提供了豐富的網絡編程 API,從底層的 Socket 編程到高層的 HTTP 通信,開發者可以根據具體需求選擇合適的工具和框架。

隨著微服務架構的普及,RESTful API 成為構建分布式系統的重要手段。Java 生態中的 Spring Boot、Netty、Apache HttpClient 等框架為網絡編程提供了更高級的抽象和更便捷的開發體驗。

在未來的發展中,隨著 5G、物聯網、邊緣計算等新技術的興起,Java 網絡編程將繼續扮演重要角色。開發者需要不斷學習和實踐,掌握最新的網絡通信技術,以應對日益復雜的網絡環境和業務需求。

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

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

相關文章

STM32的藍牙通訊(HAL庫)

藍牙基礎知識&#xff08;了解即可&#xff09;&#xff1a;1.是一種利用低功率無線電&#xff0c;支持設備短距離通信的無線電技術&#xff0c;能在包括移動電話、PDAQ、無線耳機、筆記本電腦、相關外設等眾多設備之間進行無線信息交換&#xff0c;藍牙工作在全球通用的2.4 GH…

方案B,version1

我們重新設計起步階段的步驟,目標是:通過運行PowerShell腳本和配置GitHub Actions工作流(deploy.yml)來實現自動化部署。 要求: 用私有倉庫(my-website-source-SSH)存儲源碼。 通過GitHub Actions自動構建(這里只是簡單的Hello World,所以構建步驟可以簡化為復制文件…

Linux --- 進程

一、進程概念 在 Linux 系統中&#xff0c;??進程&#xff08;Process&#xff09;?? 是程序執行的動態實例&#xff0c;是操作系統進行資源分配和調度的基本單位。 ??1. 程序 vs 進程?? ??程序&#xff08;Program&#xff09;??&#xff1a;是靜態的代碼集合&…

Cgroup 控制組學習(三)在容器中使用 CGroups

一、CGroups 關于mememory的限制操作 cgroup關于cpu操作 關于memeory cgroup的幾個要點 ① memeory限額類 1、memory.limit_bytes&#xff1a;硬限制--> 限制最大內存使用量&#xff0c;單位有k、m、g三種&#xff0c;填-1則代表無限制,默認是字節2、memory.soft_limi…

SpringBoot面試基礎知識

SpringBoot 是面試中后端開發崗位的高頻考點&#xff0c;以下是核心考點整理&#xff1a;1. SpringBoot 基礎概念- 定義&#xff1a;SpringBoot 是 Spring 框架的簡化版&#xff0c;通過“自動配置”“起步依賴”等特性&#xff0c;簡化 Spring 應用的搭建和開發&#xff0c;減…

Java面試全方位解析:從基礎到AI的技術交鋒

Java面試全方位解析&#xff1a;從基礎到AI的技術交鋒 面試場景&#xff1a;互聯網大廠Java工程師崗位面試 面試官&#xff1a;您好&#xff0c;我是今天的面試官&#xff0c;接下來我們將進行三輪技術面試。 謝飛機&#xff1a;您好您好&#xff01;我是謝飛機&#xff0c;特別…

Web Worker:解鎖瀏覽器多線程,提升前端性能與體驗

目錄 一、Web Worker 是什么&#xff1f; 核心特性 類型 二、為什么需要 Web Worker&#xff1f;(單線程的痛點) 三、Web Worker 的典型使用場景 四、一個簡單的代碼示例 (專用 Worker) 五、使用 Web Worker 的注意事項 六、總結 一、Web Worker 是什么&#xff1f; 簡…

LabVIEW命令行調用與傳參功能

該功能一方面借助 Formatinto String 構建命令行字符串&#xff0c;實現LabVIEW 環境下命令行調用 VI 并傳參&#xff1b;另一方面&#xff0c;針對 Mac 平臺&#xff0c;通過解析應用 Info.plist 文件&#xff0c;處理 LabVIEW 可執行文件路徑&#xff0c;完善跨平臺命令行調用…

使用FRP搭建內網穿透工具,自己公網服務器獨享內外網端口轉發

內網穿透&#xff0c;也即 NAT 穿透&#xff0c;進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數據包不被 NAT 設備屏蔽而正確路由到內網主機。簡單來說&#xff0c;就是讓互聯網&#xff08;外網&#xff09;設備能訪問局域網&#xff08;內網&#xff09;設備提…

JavaWeb01——基礎標簽及樣式(黑馬視頻筆記)

1.如何用VScode寫html代碼 1. 首先在vscode上安裝一些插件&#xff0c;插件如下&#xff1a; 2.打開你要寫入的html文件的文件夾&#xff0c;然后右擊“ 新建文件”&#xff0c;命名 “xxx.html”, 3.如果是寫 css文件&#xff0c;那么也是右擊“新建文件”&#xff0c;命名“x…

在2G大小的文件中,找出高頻top100的單詞

將 2GB 的大文件分割為 2048 個大小為 512KB 的小文件&#xff0c;采用流式讀取方式處理&#xff0c;避免一次性加載整個文件導致內存溢出。初始化一個長度為 2048 的哈希表數組&#xff0c;用于分別統計各個小文件中單詞的出現頻率。利用多線程并行處理機制遍歷所有 2048 個小…

基于LNMP分布式個人云存儲

1.準備工作a.關閉兩臺虛擬機的安全軟件客戶端&#xff1a;[rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld [rootmaster ~]# systemctl status firewalld ○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (…

指針運算全攻略:加減、比較與排序

常見的指針指針運算說明1.指針與整數的加減運算對指針可以進行加法運算&#xff0c;即p n或者p - n。其結果依舊是一個是一個指針&#xff0c;新的指針是在原來的地址值基礎上加上/減去n *(sizeof(指針指向的數據類型)&#xff09;個字節。示例&#xff1a;#include<stdio.…

物聯網安裝調試-物聯網網關

物聯網網關作為連接終端設備與云平臺的核心樞紐,其分類與選型需結合功能定位、硬件性能、連接方式及應用場景等多維度考量。以下從分類體系和產品推薦兩方面系統梳理,助您高效決策: ?? 一、物聯網網關分類體系 1. 按功能定位劃分 類型 核心能力 典型場景 代表產品 邊緣計…

Jenkins教程(自動化部署)

Jenkins教程(自動化部署) 1. Jenkins是什么&#xff1f; Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具&#xff0c;廣泛用于項目開發&#xff0c;具有自動化構建、測試和部署等功能。Jenkins用Java語言編寫&#xff0c;可在Tomcat等流行的servlet容器中運行&…

linux 驅動驗證是否成功 之 查看moudle信息

這些是 Linux 內核模塊&#xff08;.ko&#xff09;中的元信息&#xff08;metadata&#xff09;&#xff0c;可以通過如下方式查看&#xff1a;? 1. 使用 modinfo 命令查看已加載或已編譯模塊信息 示例&#xff1a; modinfo aw2013.ko輸出內容大概如下&#xff1a; filename:…

瀏覽器關閉之前請求接口到后端

2025.07.24今天我學習了如何在瀏覽器關閉之前請求一個接口返回到后端。可以用performance.navigation判斷是瀏覽器關閉&#xff0c;還是瀏覽器刷新&#xff0c;因為我這邊只需要瀏覽器關閉的時候才去觸發1. 利用performance API&#xff08;刷新檢測&#xff09; 刷新頁面時&am…

MySQL批量數據處理與事務管理

MySQL是一種廣泛應用的關系型數據庫管理系統&#xff0c;尤其在數據分析和業務邏輯處理方面具有重要地位。在數據量龐大的業務場景中&#xff0c;批量數據處理和事務管理是提高效率和保障數據一致性的重要手段。掌握高效的批量數據操作方法與事務管理技巧&#xff0c;不僅能夠提…

iOS網絡之異步加載

為什么你的圖片要異步加載&#xff1f;在仿寫天氣預報時&#xff0c;我們常常需要從網絡加載天氣圖標&#xff0c;例如顯示某個小時的天氣狀態圖標。這看似簡單的事情&#xff0c;如果處理不當&#xff0c;卻很容易造成界面卡頓&#xff0c;甚至影響整個 App 的用戶體驗。錯誤做…

C#值類型屬性的典型問題

問題復現&#xff1a;值類型屬性的副本問題以下代碼展示了值類型屬性的典型問題&#xff1a;struct Point {public int X;public int Y; }class MyClass {public Point Position {get; set;} }// 使用屬性修改結構體&#xff08;無效&#xff01;&#xff09; var obj new MyC…