目录

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

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

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


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

在网络通信中,无论是 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 发送的数据


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

val buffer = ByteBuffer.allocate(4).putInt(1234).array()
  • 结果是:

    [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 更加通用和高效 ,无论是发送文本、图片还是音视频,都可以用 相同的方式 传输。