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 协议本质上是一个简单的"快递员",它的任务是:
- 接收 一串二进制数据(字节数组)。
- 打包 数据,加上 IP 头、UDP 头(源端口、目标端口、数据长度等)。
- 发送 到网络。
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 就可以跨平台工作。
总结
- 计算机只能传输字节数据 ,所以 UDP 只能发送 字节数组。
- UDP 只是一个"快递员",它不关心数据类型,只搬运二进制数据。
- 所有数据都能转换为字节数组 ,所以 UDP 只需要支持 发送字节,而不用关心具体的数据类型。
- 网络上所有协议(HTTP、FTP、TCP、UDP)最终传输的都是字节数据,这样能兼容不同操作系统和设备。
- 这种设计让 UDP 更加通用和高效 ,无论是发送文本、图片还是音视频,都可以用 相同的方式 传输。