📦 5 Parts + Conclusion
👉 滑动
PART 01
开篇
痛点场景
PART 02
功能
它能做什么
PART 03
技术亮点
怎么实现
PART 04
适合谁用
应用场景
PART 05
部署
落地提醒
PART ///
写在最后
一句话总结
当信息无法平等地抵达每个人,协作效率就从那一刻开始打折。
01
PART
开篇:会议室看不清投影
OPENING · 痛点场景
培训部的同事找我吐槽:会议室永远不够用,每次内训都有一堆人挤在后面,盯着投影幕上的小字眯眼。他问,能不能让每个人在自己工位的显示器上,直接看到讲师的屏幕?
这其实是个很朴素的需求:投影仪只有一个,但电脑屏幕人人都有。与其把画面投到一块幕布上,不如把画面广播到每一台电脑。最近开源社区流出一套局域网投屏工具,用 UDP 广播把讲师屏幕实时推到同网段的所有接收端,实测 1080P 延迟不到 0.2 秒,几十台机器同时接收也不卡。不依赖服务器,不用配置路由器组播,插上就能用。

02
PART
它能做什么
FUNCTION · 功能拆解
把这套工具的用法拆开看,逻辑其实很清晰:讲师端一键发起,学员端自动接收,全程几乎零配置。
四个核心动作
讲师端一键「开始投屏」
自动抓取主屏画面,压缩成 JPEG 后 UDP 广播出去。
学员端双击运行
静默监听同网段广播,收到信号自动全屏倒计时,实时显示讲师画面。
学员端无需任何配置
只要和讲师在同一局域网,就能自动接收,不用手动填 IP。
鼠标指针显示为红色「激光笔」
培训指点时更直观,学员能清楚看到讲师在讲哪一步。
它解决的本质问题,是把「一对多」的信息展示,从一台投影仪扩展到每一块显示器。
03
PART
技术亮点:怎么做到的
HIGHLIGHT · 实现思路
真正有意思的是它的实现思路,几个设计都很克制——没有中心服务器,没有复杂协议,靠最朴素的方式把延迟压到了 0.2 秒以内。
五个设计细节
UDP 全局广播 255.255.255.255:12345:同网段设备自动发现,省去了手动填 IP 的麻烦。
动态分片:每个 UDP 包最大 1400 字节,刚好卡在 IP 不分片的临界值,避免分片丢包。
JPEG 压缩 + 动态帧率:默认 5fps,带宽占用仅约 1~2 Mbps,普通办公网络毫无压力。
帧重组缓存 + 超时清理:应对 UDP 乱序到达,避免丢帧花屏。
学员端用 PyGame 做无边框全屏显示,5 秒无帧自动退出,干净利落。
核心发送逻辑(示意)
import socket
BROADCAST_ADDR = ("255.255.255.255", 12345)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
def send_frame(jpeg_bytes):
# 动态分片:每包 ≤ 1400 字节,避免 IP 分片丢包
for i in range(0, len(jpeg_bytes), 1400):
chunk = jpeg_bytes[i:i+1400]
sock.sendto(chunk, BROADCAST_ADDR)
04
PART
适合谁用
SCENARIO · 应用场景
它不是什么大工程,却是很多场景里刚好缺的那块拼图。
中小企业内训:把讲师屏幕推到每位员工工位,后排不再眯眼。
学校机房 / 培训班:教师机画面同步到学生机,边讲边演示。
展会 / 门店:一台主机广播演示内容到多块展示屏,省下多套投屏设备。
05
PART
部署与使用
DEPLOY · 落地提醒
部署简单到不需要「部署」:被控端运行后静默监听,主控端点击开始投屏即可。唯一要留意的坑是防火墙。
!踩坑提示 🕳
Windows 防火墙可能拦截 UDP 广播,需要在入站规则里放行 UDP 12345 端口(注意是 UDP 不是 TCP)。如果放行后仍无响应,多半是网络本身禁止大量广播,需要联系网管调整,或你拥有相应管理权限。
///
LAST
写在最后
LAST · 总结
这套工具最打动我的,不是技术多高深,而是它把一件「大家都觉得该有、却一直没人做」的小事,用极低的成本解决了。没有中心服务器,没有复杂配置,一个 UDP 广播加 JPEG 压缩,就把会议室的信息不对称抹平了。
很多时候,好的工具不在于架构多华丽,而在于它精准地戳中了一个真实又具体的痛点。如果你也受够了「后排看不清投影」,不妨把它扒下来研究研究——源码就在那里,改改就能变成你自己的内训神器。
资源来源:狗凯之家源码网
夜雨聆风