Java進階之旅-day05:網絡編程

引言

????????在當今數字化的時代,網絡編程在軟件開發中扮演著至關重要的角色。Java 作為一門廣泛應用的編程語言,提供了強大的網絡編程能力。今天,我們深入學習了 Java 網絡編程的基礎知識,包括基本的通信架構、網絡編程三要素、IP 地址、TCP 協議、UDP 通信等內容。接下來,我們將對這些知識點進行詳細的總結。

基本的通信架構

????????在網絡編程中,常見的通信架構有客戶端 - 服務器(Client - Server,C/S)架構和瀏覽器 - 服務器(Browser - Server,B/S)架構。

C/S 架構

????????客戶端 - 服務器架構是一種傳統的網絡通信模式。在這種架構中,客戶端程序向服務器發送請求,服務器接收到請求后進行處理,并將處理結果返回給客戶端。例如,我們使用的 QQ、微信等即時通訊軟件就是典型的 C/S 架構應用。以下是一個簡單的 C/S 架構 Java 示例,模擬客戶端向服務器發送消息:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;// 服務器端
class SimpleServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(12345)) {System.out.println("Server is listening on port 12345");Socket socket = serverSocket.accept();BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = in.readLine();System.out.println("Received from client: " + message);socket.close();} catch (IOException e) {e.printStackTrace();}}
}// 客戶端
class SimpleClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 12345);PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {String message = "Hello, Server!";out.println(message);} catch (IOException e) {e.printStackTrace();}}
}

B/S 架構

????????瀏覽器 - 服務器架構是一種基于 Web 技術的網絡通信模式。在這種架構中,客戶端只需要通過瀏覽器訪問服務器上的網頁,服務器將網頁內容返回給瀏覽器進行顯示。例如,我們日常使用的各種網站就是 B/S 架構的應用。以下是一個簡單的 Java Servlet 示例模擬 B/S 架構的服務器端處理:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/hello")
public class HelloServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>Hello, World!</h1>");out.println("</body></html>");}
}

網絡編程三要素

????????網絡編程的三要素包括 IP 地址、端口號和協議。

IP 地址

????????IP 地址是互聯網協議地址的縮寫,它是用于標識網絡中設備的唯一標識符。通過 IP 地址,不同設備之間可以進行通信。

端口號

????????端口號是用于標識應用程序的數字。在一臺設備上,可能同時運行著多個應用程序,每個應用程序通過不同的端口號來接收和發送數據。端口號的范圍是 0 - 65535,其中 0 - 1023 通常被系統保留使用。

協議

????????協議是網絡通信中雙方必須遵循的規則和約定。常見的網絡協議有 TCP(傳輸控制協議)和 UDP(用戶數據報協議),我們將在后面詳細介紹這兩種協議。

IP 地址詳解

IP 地址的作用

????????IP 地址的主要作用是在網絡中唯一標識一臺設備,使得不同設備之間能夠進行通信。就像我們的家庭地址一樣,通過 IP 地址,數據可以準確地從源設備傳輸到目標設備。

IP 地址的分類

????????IP 地址主要分為 IPv4 和 IPv6 兩種類型。

IPv4

????????IPv4 是目前廣泛使用的 IP 地址版本,它由 32 位二進制數組成,通常用點分十進制表示,例如?192.168.1.1。由于 IPv4 地址空間有限,隨著互聯網的發展,IPv4 地址已經逐漸耗盡。

IPv6

????????IPv6 是為了解決 IPv4 地址不足的問題而推出的新一代 IP 地址版本。它由 128 位二進制數組成,采用冒號十六進制表示,例如?2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6 提供了巨大的地址空間,可以滿足未來互聯網發展的需求。

公網 IP 和 內網 IP

公網 IP

????????公網 IP 是可以直接在互聯網上訪問的 IP 地址。每個公網 IP 地址在全球范圍內都是唯一的。通常,企業、機構和互聯網服務提供商(ISP)會擁有公網 IP 地址。

內網 IP

????????內網 IP 是用于局域網內部通信的 IP 地址。內網 IP 地址在局域網內部是唯一的,但在不同的局域網中可以重復使用。常見的內網 IP 地址段有?10.0.0.0 - 10.255.255.255172.16.0.0 - 172.31.255.255?和?192.168.0.0 - 192.168.255.255

查看本機 IP 地址

Windows 系統

????????在 Windows 系統中,可以通過以下步驟查看本機 IP 地址:

  1. 打開命令提示符(CMD)。
  2. 在命令提示符中輸入?ipconfig?命令,按下回車鍵。
  3. 在輸出結果中,可以找到本機的 IP 地址信息。
Linux 系統

????????在 Linux 系統中,可以通過以下命令查看本機 IP 地址:

ifconfig
macOS 系統

????????在 macOS 系統中,可以通過以下步驟查看本機 IP 地址:

  1. 打開 “系統偏好設置”。
  2. 點擊 “網絡”。
  3. 在左側列表中選擇當前連接的網絡,右側會顯示本機的 IP 地址信息。

查看是否與對方互通

????????可以使用?ping?命令來測試是否與對方設備互通。在命令提示符或終端中輸入以下命令:

ping 對方 IP 地址

如果能夠收到對方設備的響應,表示與對方設備互通;如果無法收到響應,則可能存在網絡連接問題。

本機 IP

????????本機 IP 是指當前設備在網絡中的 IP 地址。在局域網中,本機 IP 通常是內網 IP 地址;如果設備直接連接到互聯網,則本機 IP 是公網 IP 地址。

TCP 協議特點

????????TCP(傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層協議。它具有以下特點:

面向連接

????????在進行數據傳輸之前,TCP 會先建立連接,確保雙方設備都處于可用狀態。連接建立后,雙方可以進行數據傳輸,傳輸完成后,再關閉連接。

可靠傳輸

????????TCP 通過確認機制、重傳機制和滑動窗口機制等保證數據的可靠傳輸。如果發送方發送的數據沒有收到接收方的確認信息,發送方會重新發送該數據。

字節流傳輸

????????TCP 將應用層的數據看作是無結構的字節流進行傳輸,接收方需要根據應用層的協議來解析這些字節流。

擁塞控制

????????TCP 具有擁塞控制機制,當網絡出現擁塞時,TCP 會自動調整發送數據的速率,以避免網絡擁塞進一步惡化。

UDP 通信

????????UDP(用戶數據報協議)是一種無連接的、不可靠的傳輸層協議。與 TCP 不同,UDP 在進行數據傳輸之前不需要建立連接,也不保證數據的可靠傳輸。UDP 的特點是傳輸速度快、開銷小,適用于對實時性要求較高、對數據準確性要求相對較低的應用場景,例如視頻直播、音頻通話等。

以下是一個簡單的 Java UDP 通信示例:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;// UDP 發送端
class UDPSender {public static void main(String[] args) throws IOException {// 創建 DatagramSocket 對象DatagramSocket socket = new DatagramSocket();// 要發送的數據String message = "Hello, UDP!";byte[] sendData = message.getBytes();// 目標地址和端口InetAddress address = InetAddress.getByName("localhost");int port = 8888;// 創建 DatagramPacket 對象DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);// 發送數據socket.send(sendPacket);// 關閉套接字socket.close();}
}// UDP 接收端
class UDPReceiver {public static void main(String[] args) throws IOException {// 創建 DatagramSocket 對象,并指定端口號DatagramSocket socket = new DatagramSocket(8888);// 創建接收數據的緩沖區byte[] receiveData = new byte[1024];// 創建 DatagramPacket 對象DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);// 接收數據socket.receive(receivePacket);// 解析接收到的數據String message = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received: " + message);// 關閉套接字socket.close();}
}

TCP 通信

????????TCP 通信是一種面向連接的通信方式,需要先建立連接,再進行數據傳輸,最后關閉連接。以下是一個簡單的 Java TCP 通信示例:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;// TCP 服務器端
class TCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(9999)) {System.out.println("Server is listening on port 9999...");// 等待客戶端連接Socket socket = serverSocket.accept();System.out.println("Client connected: " + socket.getInetAddress());// 獲取輸入流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 獲取輸出流PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 讀取客戶端發送的數據String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("Received from client: " + inputLine);// 向客戶端發送響應out.println("Server received: " + inputLine);}// 關閉連接socket.close();} catch (IOException e) {e.printStackTrace();}}
}// TCP 客戶端
class TCPClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 9999);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {String userInput;while ((userInput = stdIn.readLine()) != null) {// 向服務器發送數據out.println(userInput);// 讀取服務器的響應String response = in.readLine();System.out.println("Received from server: " + response);}} catch (IOException e) {e.printStackTrace();}}
}

綜合案例

????????假設我們要實現一個簡單的文件傳輸系統,客戶端將本地文件發送給服務器,服務器接收文件并保存到本地。以下是一個基于 TCP 協議的文件傳輸系統的示例代碼:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;// 文件傳輸服務器端
class FileTransferServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(12345)) {System.out.println("Server is listening on port 12345...");// 等待客戶端連接Socket socket = serverSocket.accept();System.out.println("Client connected: " + socket.getInetAddress());// 獲取輸入流InputStream in = socket.getInputStream();// 創建文件輸出流FileOutputStream fos = new FileOutputStream("received_file.txt");byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}// 關閉流和連接fos.close();in.close();socket.close();System.out.println("File received successfully.");} catch (IOException e) {e.printStackTrace();}}
}// 文件傳輸客戶端
class FileTransferClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 12345);FileInputStream fis = new FileInputStream("test_file.txt");OutputStream out = socket.getOutputStream()) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}// 關閉流和連接fis.close();out.close();socket.close();System.out.println("File sent successfully.");} catch (IOException e) {e.printStackTrace();}}
}

總結

????????通過今天的學習,我們對 Java 網絡編程有了更深入的了解。掌握了基本的通信架構、網絡編程三要素、IP 地址、TCP 協議和 UDP 通信等基礎知識,并通過實際的代碼示例加深了對這些知識的理解和應用。網絡編程是 Java 開發中非常重要的一部分,在實際項目中有著廣泛的應用,我們需要不斷學習和實踐,才能更好地掌握這門技術。

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

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

相關文章

大數據(4.3)Hive基礎查詢完全指南:從SELECT到復雜查詢的10大核心技巧

目錄 背景一、Hive基礎查詢核心語法1. 基礎查詢&#xff08;SELECT & FROM&#xff09;2. 條件過濾&#xff08;WHERE&#xff09;3. 聚合與分組&#xff08;GROUP BY & HAVING&#xff09;4. 排序與限制&#xff08;ORDER BY & LIMIT&#xff09; 二、復雜查詢實戰…

Synopsys:設計對象

相關閱讀 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 對于Synopsys的EDA工具&#xff08;如Design Compiler、PrimeTime、IC Compiler&#xff09;等&#xff0c;設計對象(Design Objects)是組成整個設計的抽象表示&…

【愚公系列】《高效使用DeepSeek》053-工藝參數調優

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

深度學習篇---模型訓練(1)

文章目錄 前言一、庫導入與配置部分介紹 二、超參數配置簡介 三、模型定義1. 改進殘差塊2. 完整CNN模型 四、數據集類五、數據加載函數六、訓練函數七、驗證函數八、檢查點管理九、主函數十、執行入口十一、關鍵設計亮點總結1.維度管理2.數據標準化3.動態學習率4.梯度剪裁5.檢查…

題解:AT_abc241_f [ABC241F] Skate

一道經典的 bfs 題。 提醒&#xff1a;本題解是為小白專做的&#xff0c;不想看的大佬請離開。 這道題首先一看就知道是 bfs&#xff0c;但是數據點不讓我們過&#xff1a; 1 ≤ H , W ≤ 1 0 9 1\le H,W\le10^9 1≤H,W≤109。 那么我們就需要優化了&#xff0c;從哪兒下手…

【含文檔+PPT+源碼】基于微信小程序的鄉村振興民宿管理系統

項目介紹 本課程演示的是一款基于微信小程序的鄉村振興民宿管理系統&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系統 3.該…

STM32定時器通道1-4(CH1-CH4)的引腳映射關系

以下是 STM32定時器通道1-4(CH1-CH4)的引腳映射關系的詳細說明,以常見型號為例。由于不同系列/型號差異較大,請務必結合具體芯片的參考手冊確認。 一、STM32F1系列(如STM32F103C8T6) 1. TIM1(高級定時器) 通道默認引腳重映射引腳(部分/完全)備注CH1PA8無互補輸出CH1…

bge-m3+deepseek-v2-16b+離線語音能力實現離線文檔向量化問答語音版

ollama run deepseek-v2:16b ollama pull bge-m3 1、離線聽寫效果的大幅度提升。50M 1.3G&#xff08;每次初始化都會很慢&#xff09;---優化到首次初始化使用0延遲響應。 2、文檔問答歷史問題處理與優化&#xff0c;文檔問答離線策略討論與參數暴露。 3、離線大模型答復中斷…

前端界面在線excel編輯器 。node編寫post接口獲取文件流,使用傳參替換表格內容展示、前后端一把梭。

首先luckysheet插件是支持在線替換excel內容編輯得但是瀏覽器無法調用本地文件&#xff0c;如果只是展示&#xff0c;讓后端返回文件得二進制文件流就可以了&#xff0c;直接使用luckysheet展示。 這里我們使用xlsx-populate得node簡單應用來調用本地文件&#xff0c;自己寫一個…

JavaScript學習20-Event事件對象

1.屬性 即點擊誰就打印出來誰 2.方法 未添加stopPropagatio方法&#xff1a; 添加stopPropagatio方法后&#xff1a;

FreeRTOS 啟動過程中 SVC 和 PendSV 的工作流程?

在 FreeRTOS 的啟動過程中,SVC(Supervisor Call) 和 PendSV(Pendable Service Call) 是兩個關鍵的系統異常,分別用于 首次任務啟動 和 任務上下文切換。它們的協作確保了從內核初始化到多任務調度的平滑過渡。以下是詳細的工作流程分析(以 ARM Cortex-M 為例): 1. SVC…

[自制調試工具]構建高效調試利器:Debugger 類詳解

一、引言 在軟件開發的漫漫征程中&#xff0c;調試就像是一位忠誠的伙伴&#xff0c;時刻陪伴著開發者解決代碼里的各類問題。為了能更清晰地了解程序運行時變量的狀態&#xff0c;我們常常需要輸出各種變量的值。而 Debugger 類就像是一個貼心的調試助手&#xff0c;它能幫我…

foobar2000 VU Meter Visualisation 插件漢化版 VU表

原英文插件點此 界面展示 下載 https://wwtn.lanzout.com/iheI22ssoybi 安裝方式 解壓安裝文件&#xff0c;文件名為&#xff1a;foo_vis_vumeter-0.10.2_CHINIESE.fb2k-component

消息中間件對比與選型指南:Kafka、ActiveMQ、RabbitMQ與RocketMQ

目錄 引言 消息中間件的定義與作用 消息中間件在分布式系統中的重要性 對比分析的四種主流消息中間件概述 消息中間件核心特性對比 消息傳遞模型 Kafka&#xff1a;專注于發布-訂閱模型 ActiveMQ&#xff1a;支持點對點和發布-訂閱兩種模型 RabbitMQ&#xff1a;支持點…

liunx輸入法

1安裝fcitx5 sudo apt update sudo apt install fcitx fcitx-pinyin 2配置為默認輸入法 設置-》系統-》區域和語言 點擊系統彈出語言和支持選擇鍵盤輸入法系統 3設置設置 fcitx-configtool 如果沒顯示需要重啟電腦 4配置fcitx 把搜狗輸入法放到第一位&#xff08;點擊下面…

WindowsPE文件格式入門05.PE加載器LoadPE

https://bpsend.net/thread-316-1-1.html LoadPE - pe 加載器 殼的前身 如果想訪問一個程序運行起來的內存,一種方法就是跨進程讀寫內存,但是跨進程讀寫內存需要來回調用api,不如直接訪問地址來得方便,那么如果我們需要直接訪問地址,該怎么做呢?.需要把dll注進程,注進去的代碼…

QGIS中第三方POI坐標偏移的快速校正-百度POI

1.百度POI&#xff1a; name,lng,lat,address 龍記黃燜雞米飯(共享區店),121.908315,30.886636,南匯新城鎮滬城環路699弄117號(A1區110室) 好福記黃燜雞(御橋路店),121.571409,31.162292,滬南路2419弄26號1層B間 御品黃燜雞米飯(安亭店),121.160322,31.305977,安亭鎮新源路792號…

SQL的調優方案

一、前言 SQL調優是提升數據庫性能的關鍵手段。需結合索引優化、SQL語句優化、執行計劃分析及數據庫架構設計等多方面綜合處理。 二、索引優化 創建合適索引 高頻查詢字段&#xff1a;對WHERE、JOIN、ORDER BY涉及的字段創建索引&#xff0c;尤其是區分度高的字段&#xff08…

【項目管理】第一部分 信息技術 1/2

相關文檔&#xff0c;希望互相學習&#xff0c;共同進步 風123456789&#xff5e;-CSDN博客 概要 知識點&#xff1a; 現代化基礎設施、數字經濟、工業互聯網、車聯網、智能制造、智慧城市、數字政府、5G、常用數據庫類型、數據倉庫、信息安全、網絡安全態勢感知、物聯網、大數…

【玩泰山派】1、mac上使用串口連接泰山派

文章目錄 前言picocom工具連接泰山派安裝picocom工具安裝ch340的驅動串口工具接線使用picocom連接泰山派 參考 前言 windows上面有xshell這個好用的工具可以使用串口連接板子&#xff0c;在mac上好像沒找到太好的工具&#xff0c;只能使用命令行工具去搞了。 之前查找說mac上…