Java【網絡原理】(2)初識網絡續與網絡編程


目錄

1.前言

2.正文

2.1TCP協議與UDP協議

2.2socket API進行網絡編程

2.2.1DatagramPacket類

2.2.1.1發送數據報

2.2.1.2接收數據報

2.2.1.3獲取數據報內容

2.2.1.4設置數據報內容

2.2.2DatagramSocket類

2.2.2.1構造方法

2.2.2.2常用方法

2.2.3具體代碼與解釋

3.小結


1.前言

哈嘍大家好吖,今天繼續給大家分享計算機網絡相關的知識,先講解傳輸層兩個重要的UDP和TCP協議,再講解在UDP中通過socket API來進行網絡編程。

2.正文

2.1TCP協議與UDP協議

在講解二者的概念與對比之前,先提前介紹幾個涉及到的概念:

有連接/無連接:指的是通信的A和B兩端是否互相保留對方的信息(即彼此之間是否知道是誰和它建立連接)。

可靠傳輸/不可靠傳輸:在網絡上,很容易出現丟包這種情況,因為光信號和電信號都可能受到外界干擾,如果在傳輸中識別到某些出錯的數據,打包丟掉,保證正常數據傳輸,這個叫做可靠傳輸,反之只管發送,不管中間的錯誤就是不可靠傳輸。

面向字節流/面向數據包:面向字節流,讀寫數據的時候,是以字節為單位面向數據報,讀寫數據的時候,以一個數據報為單位(不是字符)。

全雙工/半雙工:一個通信鏈路,支持雙向通信(能讀,也能寫) / 一個通信鏈路,只支持單向通信~~(要么讀,要么寫)

講解完以上概念,正文就可以順利開始~?

TCP(傳輸控制協議)和UDP(用戶數據報協議)是互聯網中最重要的兩種傳輸層協議,負責在應用程序之間傳輸數據。它們在設計目標、工作原理和應用場景上有顯著差異。以下是詳細的對比和解析:

TCP

特點:

  • 面向連接:通信前需通過三次握手建立可靠連接,結束時通過四次揮手釋放連接。

  • 可靠傳輸:通過確認應答(ACK)、超時重傳、數據排序、流量控制和擁塞控制確保數據完整、有序、無丟失。

  • 全雙工通信:支持雙向數據流傳輸。

  • 字節流模式:數據被看作無結構的字節流,由TCP自行分割和重組。


優點:

  • 數據可靠性高,適合文件傳輸、網頁瀏覽等場景。

  • 自動處理數據分片、重組和錯誤恢復。

缺點:

  • 建立和釋放連接的開銷大。

  • 傳輸延遲較高。


UDP

特點:

  • 無連接:直接發送數據,無需建立連接。

  • 不可靠傳輸:不保證數據到達、順序或完整性。

  • 數據報模式:每個數據包獨立處理,保留邊界。

  • 全雙工通信:支持雙向數據流傳輸。


優點:

  • 傳輸速度快、延遲低。

  • 資源占用少,適合實時性要求高的場景。

  • 支持廣播和多播(一對多通信)。

缺點:

  • 不保證數據可靠性,可能丟失或亂序。

2.2socket API進行網絡編程

接下來,就到了咱們的代碼環節了,我們將利用socket API來創建一個本地的UDP回顯服務器。那么何為回顯服務器呢?

UDP回顯服務器是一種簡單的網絡服務,它接收客戶端發送的UDP數據報,并將相同的數據報原樣返回給客戶端,即請求和響應相同。

2.2.1DatagramPacket類

在開始創建一個本地的UDP回顯服務器之前,需要先介紹一下我們要使用的DatagramPacket類:

DatagramPacket類用于封裝UDP數據報。它表示一個UDP數據報的結構,包括數據內容、目標地址、目標端口、數據長度等信息。

2.2.1.1發送數據報
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
  • buf:要發送的數據,存儲在字節數組中。

  • length:要發送的數據的長度。

  • address:目標主機的 IP 地址,類型為 InetAddress

  • port:目標主機的端口號。


2.2.1.2接收數據報
DatagramPacket(byte[] buf, int length)
  • buf:用于存儲接收到的數據的字節數組。

  • length:字節數組的長度,即最大可接收的數據長度。


2.2.1.3獲取數據報內容
  • getData():返回數據報的數據,類型為 byte[]

  • getLength():返回數據報的實際數據長度。

  • getAddress():返回發送方的 IP 地址(接收時使用)。

  • getPort():返回發送方的端口號(接收時使用)。


2.2.1.4設置數據報內容
  • setData(byte[] buf):設置數據報的數據。

  • setLength(int length):設置數據報的長度。

  • setAddress(InetAddress address):設置目標地址。

  • setPort(int port):設置目標端口。

2.2.2DatagramSocket類

DatagramSocket類用于發送和接收UDP數據報。它表示一個UDP端點,可以綁定到本地端口,并通過網絡發送和接收數據報。

2.2.2.1構造方法
  • DatagramSocket():系統隨機分配一個未使用的本地端口。
  • DatagramSocket(int port):綁定指定的本地端口。
  • DatagramSocket(int port, InetAddress address):綁定到指定的本地端口和地址。

2.2.2.2常用方法
  • void send(DatagramPacket p):發送數據報。
  • void receive(DatagramPacket p):接收數據報。
  • void close():關閉套接字。

2.2.3具體代碼與解釋

下面是具有詳細的注釋的代碼與講解:

UdpEchoServer:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpEchoServer {private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {// 指定了一個固定端口號, 讓服務器來使用.socket = new DatagramSocket(port);}public void start() throws IOException {// 啟動服務器System.out.println("服務器啟動");while (true) {// 循環一次, 就相當于處理一次請求.// 處理請求的過程, 典型的服務器都是分成三個步驟的.// 1. 讀取請求并解析.//    DatagramPacket 表示一個 UDP 數據報. 此處傳入的字節數組, 就保存 UDP 的載荷部分.DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(requestPacket);//    把讀取到的二進制數據, 轉成字符串. 只是構造有效的部分.String request = new String(requestPacket.getData(), 0, requestPacket.getLength());// 2. 根據請求, 計算響應. (服務器最關鍵的邏輯)//    但是此處寫的是回顯服務器. 這個環節相當于省略了.String response = process(request);// 3. 把響應返回給客戶端//    根據 response 構造 DatagramPacket, 發送給客戶端.//    此處不能使用 response.length()DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length,requestPacket.getSocketAddress());//    此處還不能直接發送. UDP 協議自身沒有保存對方的信息(不知道發給誰)//    需要指定 目的 ip 和 目的端口.socket.send(responsePacket);// 4. 打印一個日志System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(), requestPacket.getPort(),request, response);}}// 后續如果要寫別的服務器, 只修改這個地方就好了.// 不要忘記, private 方法不能被重寫. 需要改成 publicpublic String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);server.start();}
}

?UdpEchoClient:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket = null;// UDP 本身不保存對端的信息, 就自己的代碼中保存一下private String serverIp;private int serverPort;// 和服務器不同, 此處的構造方法是要指定訪問的服務器的地址.public UdpEchoClient(String serverIp, int serverPort) throws SocketException {this.serverIp = serverIp;this.serverPort = serverPort;socket = new DatagramSocket();}public void start() throws IOException {Scanner scanner = new Scanner(System.in);while (true) {// 1. 從控制臺讀取用戶輸入的內容.System.out.println("請輸入要發送的內容:");if (!scanner.hasNext()) {break;}String request = scanner.next();// 2. 把請求發送給服務器, 需要構造 DatagramPacket 對象.//    構造過程中, 不光要構造載荷, 還要設置服務器的 IP 和端口號DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,InetAddress.getByName(serverIp), serverPort);// 3. 發送數據報socket.send(requestPacket);// 4. 接收服務器的響應DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);socket.receive(responsePacket);// 5. 從服務器讀取的數據進行解析, 打印出來.String response = new String(responsePacket.getData(), 0, responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}
}

?

實現核心思路:

  1. 服務器端

    • 打開一個UDP套接字(Socket)。

    • 綁定到一個指定的端口,等待客戶端發送數據。

    • 接收客戶端發送的UDP數據報。

    • 將接收到的數據報原樣發送回客戶端。

    • 重復上述過程,直到服務器關閉。

  2. 客戶端

    • 打開一個UDP套接字。

    • 向服務器的指定端口發送數據報。

    • 接收服務器返回的數據報。

    • 比較發送和接收的數據是否一致,以驗證數據傳輸的完整性。

    • 關閉套接字。

3.小結

今天的分享到這里就結束了,喜歡的小伙伴不要忘記點點贊點個關注,你的鼓勵就是對我最大的支持,加油!

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

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

相關文章

【Oracle專欄】sqlplus顯示設置+腳本常用顯示命令

Oracle相關文檔,希望互相學習,共同進步 風123456789~-CSDN博客 1.內容概述 本文主要針對oracle 運維中常用知識點進行整理,包括: 1)sqlplus模式下,為了方便查詢設置相應的行寬、列寬、行數。…

在一臺win10專業版設備上使用docker的怪現象

這臺設備上,wsl環境無法直接安裝docker,必須要在宿主機安裝Docker Desktop.然后,在wsl運行前,要先啟動docker desktop,否則,你看不到你自己創建的映像。 然后如果沒有docker desktop加持,你在嘗…

Unity 中Sirenix.OdinInspector 插件常用功能梳理

案例一 public class PracticeAssets : ScriptableObject {[SerializeField][Searchable][ListDrawerSettings(ShowIndexLabels true)][LabelText("練習版數據列表")]public List<PracticeData> Practicies new List<PracticeData>(); } 1. Serialize…

C++ | 面向對象 | 類

&#x1f47b;類 &#x1f47e;語法格式 class className{Access specifiers: // 訪問權限DataType variable; // 變量returnType functions() { } // 方法 };&#x1f47e;訪問權限 class className {public:// 公有成員protected:// 受保護成員private:// 私有成員 }…

從零開始用react + tailwindcss + express + mongodb實現一個聊天程序(五) 實現登錄功能

1.登錄頁面 完善登錄頁面 和注冊差不多 直接copy signUpPage 內容 再稍微修改下 import { useState } from "react"; import { useAuthStore } from "../store/useAuthStore"; import { MessageSquare,Mail,Lock,Eye, EyeOff,Loader2} from "lucide…

Spring Boot電影評論網站系統設計與實現

隨著互聯網和娛樂產業的發展&#xff0c;電影評論網站逐漸成為人們分享觀影體驗、交流影評的重要平臺。本文將介紹一個基于Spring Boot框架開發的電影評論網站系統的功能設計與實現方案。 功能模塊概述 該電影評論網站系統分為管理員模塊和用戶模塊兩大核心部分&#xff0c;以…

XFeat:輕量級的深度學習圖像特征匹配

一、引言&#xff1a;圖像特征匹配的挑戰與XFeat的突破 在計算機視覺領域&#xff0c;圖像特征匹配是視覺定位&#xff08;Visual Localization&#xff09;、三維重建&#xff08;3D Reconstruction&#xff09;、增強現實&#xff08;AR&#xff09;等任務的核心基礎。傳統方…

【TVM教程】為 NVIDIA GPU 自動調度神經網絡

Apache TVM 是一個深度的深度學習編譯框架&#xff0c;適用于 CPU、GPU 和各種機器學習加速芯片。更多 TVM 中文文檔可訪問 →https://tvm.hyper.ai/ 作者&#xff1a;Lianmin Zheng 針對特定設備和工作負載的自動調優對于獲得最佳性能至關重要。本文介紹如何使用 auto-sched…

postgresql postgis擴展相關

項目 下載地址 http://rpmfind.net/linux/rpm2html/search.php?queryprotobuf(x86-64) Postgis Index of /postgis/source/ proj4 Index of /proj/ geos Index of /geos/ libxml2 ftp://xmlsoft.org/libxml2/ Index of /sources Json-c Releases json-c/json-c G…

解鎖健康密碼,擁抱養生生活

在快節奏的現代生活中&#xff0c;健康養生愈發重要&#xff0c;它是我們保持活力、預防疾病、享受美好生活的關鍵。那究竟如何開啟健康養生之旅呢&#xff1f; 合理飲食是養生基石。遵循 “食物多樣&#xff0c;谷類為主” 原則&#xff0c;每日攝入谷薯類、蔬菜水果、畜禽魚蛋…

JavaWeb中的cookie使用

Cookie 1、Cookie是服務端向客戶端響應的一小段數據&#xff0c;最終存放在客戶端中&#xff1b;之后客戶端每次向服務端發送請求&#xff0c;都會在請求頭中攜帶cookie 2、cookie是有時效性的&#xff0c;默認是Session級別&#xff08;整個瀏覽器關閉才會消失&#xff0c;內存…

el-input實現金額輸入

需求&#xff1a;想要實現一個輸入金額的el-input&#xff0c;限制只能輸入數字和一個小數點。失焦數字轉千分位&#xff0c;聚焦轉為數字&#xff0c;超過最大值&#xff0c;紅字提示 效果圖 失焦 聚焦 報錯效果 // 組件limitDialog <template><el-dialog:visible.s…

AcWing 藍橋杯集訓·每日一題2025·密接牛追蹤2

密接牛追蹤2 農夫約翰有 N 頭奶牛排成一排&#xff0c;從左到右依次編號為 1~N。 不幸的是&#xff0c;有一種傳染病正在蔓延。 最開始時&#xff0c;只有一部分奶牛受到感染。 每經過一個晚上&#xff0c;受感染的牛就會將病毒傳染給它左右兩側的牛&#xff08;如果有的話…

30 分鐘從零開始入門 CSS

HTML CSS JS 30分鐘從零開始入門拿下 HTML_html教程-CSDN博客 30 分鐘從零開始入門 CSS-CSDN博客 JavaScript 指南&#xff1a;從入門到實戰開發-CSDN博客 前言 最近也是在復習&#xff0c;把之前沒寫的博客補起來&#xff0c;之前給大家介紹了 html&#xff0c;現在是 CSS 咯…

LabVIEW圖像識別抗干擾分析

問題描述 在基于LabVIEW的探針定位系統中&#xff0c;存在兩個核心技術難點&#xff1a; 相機畸變導致初始定位誤差&#xff1a;非線性畸變使探針無法通過坐標變換直接精確定位&#xff0c;需采用粗定位圖像修正的兩段式控制策略。 圖像識別可靠性不足&#xff1a;復雜背景&a…

淺顯易懂HashMap的數據結構

HashMap 就像一個大倉庫&#xff0c;里面有很多小柜子&#xff08;數組&#xff09;&#xff0c;每個小柜子可以掛一串鏈條&#xff08;鏈表&#xff09;&#xff0c;鏈條太長的時候會變成更高級的架子&#xff08;紅黑樹&#xff09;。下面用超簡單的例子解釋&#xff1a; ?壹…

drupal如何支持多語言

Drupal 支持多語言的功能強大&#xff0c;可以幫助網站實現多語言內容管理。以下是如何在 Drupal 中配置和啟用多語言支持的步驟&#xff1a; 1. 啟用多語言模塊 首先&#xff0c;您需要確保已啟用 Drupal 的相關模塊。這些模塊包括&#xff1a; Language&#xff08;語言&a…

【HarmonyOS Next】鴻蒙應用折疊屏設備適配方案

【HarmonyOS Next】鴻蒙應用折疊屏設備適配方案 一、前言 目前應用上架華為AGC平臺&#xff0c;都會被要求適配折疊屏設備。目前華為系列的折疊屏手機&#xff0c;有華為 Mate系列&#xff08;左右折疊&#xff0c;華為 Mate XT三折疊&#xff09;&#xff0c;華為Pocket 系列…

SE注意力機制詳解:從原理到應用,全面解析Squeeze-and-Excitation模塊

Squeeze-and-Excitation (SE) 模塊的原理與應用 1. 引言&#xff1a;注意力機制的意義 在深度學習領域&#xff0c;注意力機制&#xff08;Attention Mechanism&#xff09;通過模擬人類視覺的“聚焦”特性&#xff0c;賦予模型動態調整特征重要性的能力。傳統卷積神經網絡&a…

Python基礎大全:Python變量詳解

以下是 Python 變量的詳細解析&#xff1a; 1. 變量的本質 Python 變量本質上是一個 指向對象的引用&#xff08;類似標簽&#xff09;&#xff0c;而不是存儲數據的容器。 變量賦值 a 10 時&#xff0c;Python 會創建一個整數對象 10&#xff0c;然后讓變量 a 指向這個對象…