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 更加通用和高效 ,无论是发送文本、图片还是音视频,都可以用 相同的方式 传输。
相关推荐
*星星之火*1 小时前
【GPT入门】第5课 思维链的提出与案例
android·gpt
EasyCVR2 小时前
EasyRTC嵌入式视频通话SDK的跨平台适配,构建web浏览器、Linux、ARM、安卓等终端的低延迟音视频通信
android·arm开发·网络协议·tcp/ip·音视频·webrtc
韩家老大2 小时前
RK Android14 在计算器内输入特定字符跳转到其他应用
android
张拭心4 小时前
2024 总结,我的停滞与觉醒
android·前端
夜晚中的人海4 小时前
【C语言】------ 实现扫雷游戏
android·c语言·游戏
ljx14000525506 小时前
Android AudioFlinger(一)——初识AndroidAudio Flinger
android
ljx14000525506 小时前
Android AudioFlinger(四)—— 揭开PlaybackThread面纱
android
Codingwiz_Joy6 小时前
Day04 模拟原生开发app过程 Androidstudio+逍遥模拟器
android·安全·web安全·安全性测试
叶羽西6 小时前
Android15 Camera框架中的StatusTracker
android·camera框架
梦中千秋6 小时前
安卓设备root检测与隐藏手段
android