AI 编程课
完整教案
自学课件
18 课 · 共 18/48

设备怎样收发消息 ——TCP、UDP 与端口

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
配套代码
见项目 demo 目录

自学读本:跟着读、照着做,卡住就问 AI

你好,我是吴老师。

这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。

读完之后,你应该能:用"楼/房间"比喻说出 IP 和端口的关系;说出 TCP 和 UDP 的区别并各举一个例子;解释 server.available()udp.parsePacket() 各自在干什么;亲手让板子当 TCP 服务器、UDP 监听者、TCP 客户端,并从电脑和它对话。

用时:60–90 分钟。准备:板子、数据线、已接入板卡 Skill 的 WorkBuddy、一台连在同一 WiFi 的电脑(用来和板子对话)。


一、从"门牌号"再往前走一步

上一课板子连上 WiFi,拿到了 IP 地址——我说是网里的"门牌号"。

今天先想一个问题:板子有了门牌号,数据就知道往哪送了吗?

一栋楼有地址,楼里还住着好几户。邮差送到楼下,还得知道敲哪扇门。板子也一样:它能同时跑好几个服务(WiFi 是一个、聊天是一个、以后网页又是一个),数据只凭 IP 找到板子还不够,还得知道找板子上的哪个服务

这就是今天第一个主角:端口(port)

二、一个接得住的比喻:端口是"楼里的房间号"

名字通俗说法干什么用
IP 地址楼的地址数据先靠它找到"哪块板子"
端口楼里的房间号再靠它找到"板子上的哪个服务"

一句记牢:IP 找楼,端口找房间里的某个服务。 同一块板子,聊天服务住 10000 号房间、网页服务住 80 号房间,靠"IP + 端口"才能精准敲门。

💡 本课一句话:板子有 IP 只是"能被找到",加上端口才知道"找哪个服务"——IP 是门牌号,端口是房间号。

小目标:让板子开一个聊天服务在 10000 号房间,你从电脑敲它家门,看文字怎么传过去。

三、两条送信的路:TCP 和 UDP

  • TCP 像打电话:先拨号接通,对方接了才聊;说出去的话保证按顺序到、丢了重发。慢一点,但可靠。
  • UDP 像扔纸条:写好直接扔过去,不保证收到、不保证顺序,但快、省事。

⚠️ 比喻有边界:TCP "像打电话"是"先建立连接再传数据",不是真有电话线;UDP "像扔纸条"也可能到,只是它不打包票;"可靠"要代价——TCP 比 UDP 多花时间步骤。

什么场景用哪个?先别背,用现象自己体会。

四、让板子当 TCP 服务器(先接通,再说话)

请使用课程的 esp32s3-touchboard-hardware-dev Skill,
烧录本课配套程序 assets/codes/demo01_tcp_server:
板子以 TCP 服务器启动,连上 WiFi 后屏幕打印 IP 和端口 10000。
烧录前把 YOUR_WIFI_SSID / YOUR_WIFI_PASSWORD 改成教室真实 WiFi。
烧录后把板子屏幕显示的 IP 告诉我。

板子显示 IP 和"Waiting for PC..."后,在电脑上连它(<板子IP> 换成屏幕上的 IP):

telnet <板子IP> 10000
# 或:  nc <板子IP> 10000

敲一行回车,板子把这行原样回显给你,也打到自己屏幕。

我观察到的现象勾选
连上前,板子一直"Waiting for PC..."
我敲一行,电脑收到同样回显
板子屏幕也出现我发的那行
我关掉连接,板子显示"PC left."

停下想:为什么我还没打字,板子就"知道我在了"? 因为 TCP 先接通再说话——你敲 telnet 那下,电脑和板子先完成"握手",之后才聊。代码里 server.available() 就是板子一直问"有谁敲门吗?",谁敲了才开门。

五、让板子当 UDP 监听者(扔纸条)

请改烧录 assets/codes/demo02_udp_listener:
板子以 UDP 在端口 10001 监听;电脑发来的文字,板子打印来源和内容,回 "ACK:..." 回执。
WiFi 占位符同样改成教室真实 WiFi。烧录后告诉我板子 IP。

电脑端发一条(<板子IP> 换屏幕 IP):

# Linux/macOS
echo "hi board" | nc -u -w1 <板子IP> 10001
# Windows 用 Python
python -c "import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.sendto(b'hi board',('<板子IP>',10001))"

板子屏幕跳出 From <你电脑IP>:<端口> hi board。多试几次。

我观察到的现象勾选
我没"接通"任何东西,板子直接收到字
板子回了一张 "ACK:..." 回执
有时发一条,板子没反应(偶尔丢)
来源 IP 是我电脑的 IP

和 TCP 的反差:上一份你要先 telnet 接通;这一份啥也没"连",纸条就飞过去了。 代码里 udp.parsePacket() 就是"有没有纸条飞进来?"——有就拆开看,没有就过。没有"敲门"这一步,所以叫"无连接"。

六、让板子当 TCP 客户端(主动拨号)

请改烧录 assets/codes/demo03_tcp_client:
板子作为 TCP 客户端,主动连电脑(端口 10002)。
烧录前把 WiFi 占位符改成教室 WiFi,并把 YOUR_PC_IP 改成你电脑局域网 IP
(Windows 跑 ipconfig 看 IPv4)。烧录后告诉我板子屏幕显示什么。

先在电脑端起一个 TCP 服务器(一行 Python):

python -c "import socket;s=socket.socket();s.bind(('',10002));s.listen(1);c,a=s.accept();print('got:',c.recv(1024));c.sendall(b'Hi board\n')"

给板子上电。板子发 "Hello from board!",把电脑回的 "Hi board" 打到屏幕。

我观察到的现象勾选
板子"Dialing PC..."然后"Connected!"
屏幕出现"PC said: Hi board"
把 YOUR_PC_IP 填错,显示"Connect FAILED"

收口:客户端和服务器只是"谁先拨号"的区别——服务器等敲门(server.available()),客户端去敲门(client.connect(ip, port)),敲通了两边都能说,本质都是 TCP。

七、改一个条件:关掉"确认",看消息缺一块

先预测:发送端故意每发 3 个丢 1 个,用 UDP 传 10 句话,接收端会看到什么?

我改了什么我预测实际看到
UDP 发送端每 3 个丢 1 个自己填(如"收到 7 句,缺 3 句")讨论后填

关键反转:其实"编号 + 确认"我们也能在 UDP 上自己加!

  • 发送端给每条消息编号:Msg#1Msg#2……
  • 接收端收到回:ACK#2
  • 发送端超时没收到 ACK#3,就重发 3 号

同样是 UDP 这条"快但不保证"的路,自己加了编号和确认,就能做出 TCP 那种"不丢"的可靠感。 TCP 不过是把这套动作"内置"了。

💡 收口:TCP = UDP + 编号 + 确认 + 顺序(协议帮你做好)。选通信方式,真正要问的是——"我在乎到不到,还是快不快?"

八、一条完整的"对话"链路

TCP(可靠,先接通):
    客户端 client.connect(对方IP, 端口)
    三次握手 → 接通
    发数据,每条编号,等 ACK
    对方按序收到,丢了重发

UDP(快,无连接):
    直接往对方 IP+端口 扔数据
    不等接通、不确认
    对方 udp.parsePacket() 收到就用
    想要可靠?自己加"编号 + 确认 + 重发"

真正记牢一句:IP+端口 决定"敲哪扇门",TCP/UDP 决定"怎么把话送到"。

九、故障排查:没收到怎么办

现象先检查
板子一直 Waiting/Listening,电脑连不上电脑和板子同一 WiFi 吗?IP 对吗?防火墙挡端口?
TCP 连上立刻断电脑服务器有 accept 吗?端口被占用?
UDP 发了没回UDP 不保证到,多试;IP/端口没填反?板子真连上 WiFi 了吗?
显示"Connect FAILED"YOUR_PC_IP 是电脑局域网 IP 吗?电脑服务器起好了吗?

把现象如实告诉 AI,一次让它教你查一件事。

💡 老规矩:"没收到"是观察,"板子没连上 WiFi"是推测。 推测靠日志和实验验证。串口波特率 115200。

十、过关检查

不看 AI,自己说:

  1. IP 和端口分别像楼里的什么?为什么光有 IP 不够?
  2. TCP "像打电话"在哪点像?"握手"是你在代码里写的吗?
  3. server.available()udp.parsePacket() 各自在问什么?一个要先接通、一个不用,差别在哪?
  4. UDP 为什么"快但不保证"?加什么能在 UDP 上做出可靠感?
  5. 客户端和服务器本质区别是"谁先拨号"吗?举生活例子。
  6. 聊天、传感器上报、视频直播,分别更适合 TCP 还是 UDP?说理由。

十一、还能玩什么

方向想法继续想
局域网文字传话器电脑打字,板子屏幕实时显示聊天怎样给每条消息加"编号 + 已读回执"?
谁是离板子最近的设备板子 UDP 广播,谁先回谁就近用 RSSI(第 17 课)能更准判断远近吗?
可靠的"慢"通道用 TCP 传一张小图片/一段笔记图片太大时,TCP 的可靠会不会变慢?
广播大喇叭一块板 UDP 广播,十块板同时收到哪些场景"一对多"比"一对一"更合适?

想做"板子去网上找一个 AI 聊天"?那需要板子会一套"网上对话"规则(HTTP/JSON)——第 19 课的事。这课的"端口 + TCP/UDP",就是那扇门的第二道缝。

本节配套资源 · 在线烧录

查看全部固件 →

下列演示程序已编译为可烧录固件。把你的 ESP32-S3 触摸屏板 用 USB 接上电脑(需 Chrome / Edge 浏览器),点「在线烧录」即可直接写入,无需安装任何软件。

第 18 课 · 板子当 TCP 服务器
可烧录

电脑 telnet 连上板子 10000 端口,敲一行板子回显一行——像可靠电话线:先接通再说话。

18 TCP/UDP
第 18 课 · UDP 收纸条
可烧录

电脑向板子 10001 端口丢 UDP "纸条",板子照收并回执——像明信片:不保证送达,多试几次。

18 TCP/UDP
第 18 课 · 板子当 TCP 客户端
可烧录

板子主动拨号连电脑的 10002 端口,发 "Hello from board!",把电脑回的话打到屏幕。

18 TCP/UDP