UDP 发送数据时需要先将数据转换为字节数组再发送,主要是因为计算机网络传输的最基本单位是“字节”(Byte)。让我们从以下几个方面来深入理解这个设计选择:
在网络通信中,无论是 TCP 还是 UDP,最终传输的都是二进制数据。计算机不能直接传输字符串、整数或对象,而是需要转换为字节数组。
示例:发送字符串 "Hello"
val data = "Hello".toByteArray() // 转换为字节数组
"Hello"
不是存字符串,而是存储对应的 ASCII/UTF-8 字节:H -> 72 (0x48)
e -> 101 (0x65)
l -> 108 (0x6C)
l -> 108 (0x6C)
o -> 111 (0x6F)
toByteArray()
生成的字节数组:[72, 101, 108, 108, 111]
UDP 协议本质上是一个简单的“快递员”,它的任务是:
UDP 不关心数据的类型,它只知道:
这就像:
因为所有数据最终都能转换成字节数组,所以 UDP 传输时不需要关心数据格式。例如:
toByteArray()
ByteBuffer.allocate(4).putInt(value).array()
不管是什么数据,只要能变成字节数组,UDP 就能传输。
示例:发送整数 1234
val buffer = ByteBuffer.allocate(4).putInt(1234).array()
[0, 0, 4, 210] // 这是 1234 的二进制表示
不仅是 UDP,所有网络协议最终传输的都是字节:
无论是字符串、图片、视频、音频,在网络上传输时都必须转换为字节流,这样才能统一处理。
如果 UDP 允许直接发送 字符串、整数、对象,那么:
int
,一个 Python 设备接收,它就可能无法解析。而字节数组是最通用的格式,不同设备(Windows、Linux、Android、iOS)都能理解字节数据,这样 UDP 就可以跨平台工作。