為什么玩游戲用UDP,看網頁用TCP?

圖片

故事場景:兩種不同的遠程溝通方式

假設你需要和遠方的朋友溝通一件重要的事情。

方式一:TCP — 打一個重要的電話

打電話是一種非常嚴謹、可靠的溝通方式。

  • ??1. 建立連接 (三次握手):

    • ? 你拿起電話,撥號(SYN)。

    • ? 朋友那邊電話鈴響,他拿起電話說“喂?”(SYN-ACK)。

    • ? 你聽到他的聲音后,說“是我,能聽清嗎?”(ACK)。

    • ? 至此,一條清晰、穩定、雙向的通話線路建立完成

    • 圖片

  • ??2. 可靠傳輸 (確認與重傳):

    • ? 你說一句話,會下意識地等朋友“嗯”一聲作為確認。如果他沒反應,你可能會問“你還在聽嗎?我剛才說……”,然后把剛才的話重說一遍

    • ? 你說的話很長,你會把它分成幾句,并按邏輯順序說。朋友那邊也會按你說的順序理解。TCP保證了數據的完整有序

    • 圖片

  • ??3. 斷開連接 (四次揮手):

    • ? 聊完后,你說“那我掛了啊”,朋友說“好的,再見”,然后雙方掛斷電話,禮貌地結束通話

    • 圖片

  • ??性格總結:?TCP?就像一個嚴謹、負責、有點啰嗦的管家。他必須確保每一個信息都被對方準確無誤地、按順序地接收到。雖然準備工作和確認過程有點慢,但絕對可靠。

方式二:UDP — 寄一張隨意的明信片

寄明信片是一種非常簡單、快捷,但不太可靠的溝通方式。

  • ??1. 無連接:

    • ? 你寫好一張明信片,填上地址,直接往郵筒里一扔,你的任務就結束了。你根本不需要提前確認朋友在不在家,或者他家的郵筒是不是好的。

    • 圖片

  • ??2. 不可靠傳輸:

    • ? 這張明信片在路上可能會丟失,可能會被大雨淋濕字跡(數據損壞),你對此一無所知。

    • ? 如果你連續寄了三張明信片,它們可能會因為不同的郵路,導致到達順序和你寄出的順序不一致。朋友可能先收到第三張,再收到第一張。

    • ? 你完全不會收到任何“已收到”的回執

    • 圖片

  • ??性格總結:?UDP?就像一個追求速度、心很大的快遞小哥。他的任務就是用最快的速度把包裹扔出去,不打包票、不要求簽收、不負責售后。雖然快,但可能會丟件或送錯順序。

  • 圖片

故事總結:

特性

TCP (打電話)UDP (寄明信片)
是否連接

??面向連接?(必須先“撥號”建立通話)

??無連接?(直接“扔郵筒”)

是否可靠

??可靠?(有確認、有重傳,保證送達)

??不可靠?(盡力而為,可能丟失)

是否有序

??有序?(保證信息按順序到達)

??無序?(可能先到后發)

速度

?(準備工作和確認機制有開銷)

?(沒有額外開銷,只管發送)

核心比喻打電話寄明信片
應用場景要求絕對可靠

:網頁瀏覽(HTTP)、文件傳輸(FTP)、電子郵件(SMTP)

追求速度,能容忍少量丟失

:在線游戲、視頻直播、語音通話(VoIP)

如何選擇?

  • ? 當你發送的每一個字節都至關重要,絕不能出錯或丟失時(比如網頁、郵件、代碼文件),選擇?TCP

  • ? 當你追求實時性,速度遠比偶爾丟失一兩個數據包更重要時(比如直播畫面卡一下、游戲里一個位置信息更新慢了半拍),選擇?UDP

第一步:核心代碼

要完整實現這兩種協議的通信,代碼會比較長。因此,我們這里只展示它們在編程范式上最核心、最能體現差異的“骨架”代碼。

1. TCP - 面向連接、可靠的信使

TCP的編程模式,就像是先建立一條專屬的電話線,然后才能開始通話。

// TCP Server - Conceptual Code
// 1. 開一家“總機”(ServerSocket),在特定端口上監聽來電
ServerSocketserverSocket=newServerSocket(8080);
System.out.println("TCP 服務端:正在等待客戶來電...");// 2. 接聽電話(accept),這是一個阻塞操作,會一直等到有人打進來
// ? ?一旦接聽,就建立了一個專屬的通話線路(Socket)
SocketclientSocket=?serverSocket.accept();?
System.out.println("TCP 服務端:電話接通!可以開始通話了。");// 3. 在這個專屬線路上進行可靠的讀寫
InputStreaminput=?clientSocket.getInputStream();
OutputStreamoutput=?clientSocket.getOutputStream();
output.write("你好,這里是客服中心。".getBytes());
intdata=?input.read();?// 讀取對方發來的信息
// ...// 4. 通話結束,掛斷電話
clientSocket.close();
serverSocket.close();// TCP Client - Conceptual Code
// 1. 拿出電話(Socket),撥打總機的號碼(IP和端口)
Socketsocket=newSocket("localhost",?8080);
System.out.println("TCP 客戶端:電話已撥通,連接成功!");// 2. 在這個專屬線路上進行可靠的讀寫
OutputStreamclientOutput=?socket.getOutputStream();
InputStreamclientInput=?socket.getInputStream();
clientOutput.write("我想咨詢一個問題。".getBytes());
intresponse=?clientInput.read();?// 讀取對方的回應
// ...// 3. 掛斷電話
socket.close();

2. UDP - 無連接、盡力而為的信使

UDP的編程模式,就像是不斷地往一個公共郵箱里寄送明信片,每張明信片都得寫清楚收件人地址。

// UDP Sender - Conceptual Code
// 1. 找一個“郵筒”(DatagramSocket)來寄信
DatagramSocketsocket=newDatagramSocket();
Stringmessage="緊急通知,下午三點開會!";
byte[] buffer = message.getBytes();// 2. 寫一張“明信片”(DatagramPacket),填上內容、收件人地址和端口
InetAddressaddress=?InetAddress.getByName("localhost");
DatagramPacketpacket=newDatagramPacket(buffer, buffer.length, address,?9090);// 3. 把明信片扔進郵筒,任務完成!不關心對方是否收到
System.out.println("UDP 發送方:已將通知明信片發出。");
socket.send(packet);// 4. 關閉郵筒
socket.close();// UDP Receiver - Conceptual Code
// 1. 在指定的“信箱”(端口)旁邊準備一個“籃子”(DatagramSocket)收信
DatagramSocketsocket=newDatagramSocket(9090);
byte[] buffer =?newbyte[1024];// 2. 準備一張空白的“明信片”(DatagramPacket)來裝信
DatagramPacketpacket=newDatagramPacket(buffer, buffer.length);// 3. 等待信件投遞,這是一個阻塞操作
System.out.println("UDP 接收方:正在等待接收明信片...");
socket.receive(packet);?// 會一直等到有明信片進來// 4. 收到信后,拆開看看
StringreceivedMessage=newString(packet.getData(),?0, packet.getLength());
System.out.println("UDP 接收方:收到通知:"?+ receivedMessage);// 5. 關閉信箱
socket.close();

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

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

相關文章

【EGSR2025】材質+擴散模型+神經網絡相關論文整理隨筆(二)

High-Fidelity Texture Transfer Using Multi-Scale Depth-Aware Diffusion 這篇文章可以從一個帶有紋理的幾何物體出發,將其身上的紋理自動提取并映射到任意的幾何拓撲結構上(見下圖紅線左側);或者從一個白模幾何對象出發&#x…

深度學習圖像分類數據集—玉米粒質量識別分類

該數據集為圖像分類數據集,適用于ResNet、VGG等卷積神經網絡,SENet、CBAM等注意力機制相關算法,Vision Transformer等Transformer相關算法。 數據集信息介紹:玉米粒質量識別分類:[crush, good, mul] 訓練數據集總共有3…

Unity VR手術模擬系統架構分析與數據流設計

Unity VR手術模擬系統架構分析與數據流設計 前言 本文將深入分析一個基于Unity引擎開發的多人VR手術模擬系統。該系統采用先進的網絡架構設計,支持多用戶實時協作,具備完整的手術流程引導和精確的工具交互功能。通過對系統架構和數據管道的詳細剖析&…

【Spring Boot】Spring Boot 4.0 的顛覆性AI特性全景解析,結合智能編碼實戰案例、底層架構革新及Prompt工程手冊

Spring Boot 4.0 的顛覆性AI特性全景解析,結合智能編碼實戰案例、底層架構革新及Prompt工程手冊一、Spring Boot 4.0 核心AI能力矩陣二、AI智能編碼插件實戰(Spring AI Assistant)1. 安裝與激活2. 實時代碼生成場景3. 缺陷預測與修復三、AI引…

audiobookshelf-web 項目怎么運行

git clone https://github.com/audiobookshelf/audiobookshelf-web.git cd audiobookshelf-web npm i 啟動項目 npm run dev http://localhost:3000/

掃描文件 PDF / 圖片 糾斜 | 圖片去黑邊 / 裁剪 / 壓縮

問題:掃描后形成的 PDF 或圖片文檔常存在變形傾斜等問題,手動調整頗為耗時費力。 一、PDF 糾斜 - Adobe Acrobat DC 1、所用功能 掃描和 OCR: 識別文本:在文件中 → 設置 確定后啟動掃描,識別過程中自動糾偏。 2、…

適配器模式:兼容不兼容接口

將一個類的接口轉換成客戶端期望的另一個接口,解決接口不兼容問題。代碼示例:// 目標接口(客戶端期望的格式) interface ModernPrinter {void printDocument(String text); }// 被適配的舊類(不兼容) class…

流程控制:從基礎結構到跨語言實踐與優化

流程控制 一、流程控制基礎概念與核心價值 (一)流程控制定義與本質 流程控制是通過特定邏輯結構決定程序執行順序的機制,核心是控制代碼運行路徑,包括順序執行、條件分支、循環迭代三大核心邏輯。其本質是將無序的指令集合轉化為有…

Http與Https區別和聯系

一、HTTP 詳解 HTTP(HyperText Transfer Protocol)?? 是互聯網數據通信的基礎協議,用于客戶端(瀏覽器)與服務器之間的請求-響應交互 核心特性??: 1.無連接(Connectionless)??…

飛算JavaAI:開啟 Java 開發 “人機協作” 新紀元

每日一句 明天是新的一天, 你也不再是昨天的你。 目錄每日一句一、需求到架構:AI深度介入開發“源頭設計”1.1 需求結構化:自然語言到技術要素的精準轉化1.2 架構方案生成:基于最佳實踐的動態適配二、編碼全流程:從“…

Qt項目鍛煉——TODO(五)

發現問題如果是自己創建的ui文件,怎么包含進自己的窗口類并且成為ui成員?一般來說Qt designer 會根據你.ui文件生成對應的ui_文件名這個類(文件名是ui文件名),它包含了所有 UI 組件(如按鈕、文本框、標簽等…

Vue框架之模板語法全面解析

Vue框架之模板語法全面解析一、模板語法的核心思想二、插值表達式:數據渲染的基礎2.1 基本用法:渲染文本2.2 純HTML渲染:v-html指令2.3 一次性插值:v-once指令三、指令系統:控制DOM的行為3.1 條件渲染:v-if…

從零開始的語言模型構建 CS336 第一課(一)

語言模型的發展歷史 🏗 Early foundation models (2010年代后期) 2018:ELMo(基于 LSTM 預訓練 微調)[Peters 2018]2018:BERT(基于 Transformer 預訓練 微調)[Devlin 2018]2019:G…

微信獲取access_token授權的兩種不同情況

1.網頁授權:需要頁面調用授權的sdk,首先需要獲取到code參數 (A.網頁版的獲取code參考另一篇文章:https://blog.csdn.net/ettamei/article/details/148763361?spm1011.2415.3001.5331 B.前端sdk提供:code只有5分鐘的有…

達夢數據庫windows靜默安裝

<DATABASE> <!-- 安裝數據庫的語言配置&#xff0c;簡體中文版: ZH&#xff0c;繁體中文版: CHT&#xff0c;英文版: EN&#xff0c;不區分大小寫。不允許為空 --> <LANGUAGE>ZH</LANGUAGE> <!-- 安裝程序的時區配置&#xff0c;缺省為08:00&#…

20250709榮品RD-RK3588開發板的Android13系統下修改為連續長按10s開機

20250709榮品RD-RK3588開發板的Android13系統下修改為連續長按10s開機 2025/7/9 10:11緣起&#xff1a;由于榮品RD-RK3588開發板使用的PMIC是RK806。 以前在榮品PRO-RK3566開發板上使用的PMIC是RK809上做過了長按開機的。 直接遷移過來了&#xff01;1、根據RK809的DATASHEET&a…

20250713-`Seaborn.pairplot` 的使用注意事項

Seaborn.pairplot 的使用注意事項 sns.pairplot 是 Seaborn 中最常用、最強大的探索性數據分析&#xff08;EDA&#xff09;函數之一。 它在一個調用里就能同時展示&#xff1a; 任意兩兩變量間的 散點圖&#xff08;觀察關系、聚類、異常值&#xff09;對角線上每個變量的 單…

如何選擇合適的AI論文寫作工具?七個AI英文論文寫作網站

在寫作英文論文時&#xff0c;許多人往往會遇到寫作思路卡殼、語言不流暢、重復率過高等問題。幸運的是&#xff0c;AI論文寫作工具的出現&#xff0c;極大地提升了寫作效率和質量。這些工具不僅可以幫你快速生成內容、擴展論點&#xff0c;還可以優化語言&#xff0c;幫助你順…

【保姆級喂飯教程】idea中安裝Conventional Commit插件

目錄前言一、安裝二、測試前言 之前了解到了Conventional Commit規范&#xff0c;idea中好像沒什么鉤子工具&#xff0c;測試一下Conventional Commit插件吧 一、安裝 點擊file-settings 點擊plugins插件&#xff0c;搜索Conventional Commit&#xff0c;點擊install安裝&…

# 電腦每次重啟都自動啟動惠普安裝程序,怎么取消?

電腦每次重啟都自動啟動惠普安裝程序&#xff0c;怎么取消&#xff1f; 一、通過任務管理器禁用&#xff1a; 1&#xff09;右鍵點擊任務欄上的空白區域&#xff0c;選擇 “任務管理器”。 2&#xff09;在任務管理器窗口中&#xff0c;點擊頂部菜單欄上的 “啟動” 選項卡。 3…