UDP学习笔记(一)为什么UDP需要先将数据转换为字节数组

UDP 发送数据时需要先将数据转换为字节数组 再发送,主要是因为计算机网络传输的最基本单位是"字节"(Byte)。让我们从以下几个方面来深入理解这个设计选择:


1. 计算机网络只能传输"字节"

在网络通信中,无论是 TCP 还是 UDP,最终传输的都是二进制数据 。计算机不能直接传输字符串、整数或对象,而是需要转换为字节数组

📌 示例:发送字符串 "Hello"

kotlin 复制代码
val data = "Hello".toByteArray() // 转换为字节数组
  • 计算机存储 "Hello" 不是存字符串,而是存储对应的 ASCII/UTF-8 字节

    复制代码
    H -> 72 (0x48)
    e -> 101 (0x65)
    l -> 108 (0x6C)
    l -> 108 (0x6C)
    o -> 111 (0x6F)
  • toByteArray() 生成的字节数组:

    kotlin 复制代码
    [72, 101, 108, 108, 111]
  • 这些字节才是真正可以通过 UDP 发送的数据


2. UDP 只是负责"搬运"字节数据

UDP 协议本质上是一个简单的"快递员",它的任务是:

  1. 接收 一串二进制数据(字节数组)。
  2. 打包 数据,加上 IP 头、UDP 头(源端口、目标端口、数据长度等)。
  3. 发送 到网络。

UDP 不关心数据的类型,它只知道:

  • 这是一串二进制数据(字节数组)。
  • 需要发送到某个 IP 和端口。

这就像:

  • 快递员不管你寄的是书、本子还是手机,他们只在乎包装好的箱子(字节数组)。
  • UDP 也不管数据是不是字符串、图片或视频,它只是传输"字节"。

3. 统一格式,适用于所有数据类型

因为所有数据最终都能转换成字节数组,所以 UDP 传输时不需要关心数据格式。例如:

  • 字符串 :转换为字节数组 toByteArray()
  • 整数 :转换为字节数组 ByteBuffer.allocate(4).putInt(value).array()
  • 图片:JPEG/PNG 本质上也是字节数组
  • 音视频流:H.264/MP3 等数据流都是字节数组

不管是什么数据,只要能变成字节数组,UDP 就能传输

📌 示例:发送整数 1234

kotlin 复制代码
val buffer = ByteBuffer.allocate(4).putInt(1234).array()
  • 结果是:

    kotlin 复制代码
    [0, 0, 4, 210] // 这是 1234 的二进制表示
  • 这个字节数组就可以通过 UDP 发送了。


4. 其他协议(如 TCP)也是传输字节

不仅是 UDP,所有网络协议最终传输的都是字节

  • HTTP 发送网页数据:HTML 文件也是字节数据。
  • FTP 传输文件:文件本质上也是字节流。
  • WebSocket 传输消息:消息数据同样要转换为字节数组。

无论是字符串、图片、视频、音频,在网络上传输时都必须转换为字节流,这样才能统一处理。


5. 提高数据传输的灵活性

如果 UDP 允许直接发送 字符串、整数、对象,那么:

  • 每种数据类型的发送方式都不同,协议设计会变得复杂。
  • 不同设备可能理解不了数据 ,比如一个 Java 设备发送 int,一个 Python 设备接收,它就可能无法解析。

字节数组是最通用的格式,不同设备(Windows、Linux、Android、iOS)都能理解字节数据,这样 UDP 就可以跨平台工作。


总结

  1. 计算机只能传输字节数据 ,所以 UDP 只能发送 字节数组
  2. UDP 只是一个"快递员",它不关心数据类型,只搬运二进制数据。
  3. 所有数据都能转换为字节数组 ,所以 UDP 只需要支持 发送字节,而不用关心具体的数据类型。
  4. 网络上所有协议(HTTP、FTP、TCP、UDP)最终传输的都是字节数据,这样能兼容不同操作系统和设备。
  5. 这种设计让 UDP 更加通用和高效 ,无论是发送文本、图片还是音视频,都可以用 相同的方式 传输。
相关推荐
2501_915921436 小时前
从 HBuilder 到 App Store,uni-app 与 HBuilder 项目的 iOS 上架流程实战解析
android·ios·小程序·https·uni-app·iphone·webview
天向上6 小时前
ubuntu系统adb shell报错 ADB server didn‘t ACK
android·linux·ubuntu·adb
xiaoyan20157 小时前
自研2025版flutter3.38实战抖音app短视频+聊天+直播商城系统
android·flutter·dart
愤怒的代码7 小时前
深入解析 SystemUI 依赖注入:Dagger2 实践剖析
android·dagger
游戏开发爱好者87 小时前
以 uni-app 为核心的 iOS 上架流程实践, 从构建到最终提交的完整路径
android·ios·小程序·https·uni-app·iphone·webview
hashiqimiya7 小时前
在hbuidex的项目导入androidstudio离线生成apk
android
QING6187 小时前
Kotlin Flow 去重 (distinctUntilChanged) 详解
kotlin·android studio·android jetpack
QING6187 小时前
Kotlin Flow 节流 (Throttle) 详解
android·kotlin·android jetpack
Kapaseker8 小时前
Context 知多少,组件通联有门道
android·kotlin
游戏开发爱好者88 小时前
构建可落地的 iOS 性能测试体系,从场景拆解到多工具协同的工程化实践
android·ios·小程序·https·uni-app·iphone·webview