为什么玩游戏用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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…