0

0

Python mDNS 的本地服务发现

冰川箭仙

冰川箭仙

发布时间:2026-02-24 20:10:02

|

639人浏览过

|

来源于php中文网

原创

zeroconf是当前最靠谱的python mdns方案,因其原生封装dns-sd、跨平台支持、自动处理去重/ttl/缓存/冲突,而dnspython手动实现易出错且不完整。

python mdns 的本地服务发现

为什么 zeroconf 是当前最靠谱的选择

Python 原生不带 mDNS 实现,socket 层手动发包既难调试又容易被防火墙/网络策略拦截。社区里真正稳定可用的只有 zeroconf(即 python-zeroconf),它封装了 DNS-SD 协议细节,跨平台支持 macOS / Linux / Windows,且默认使用多播地址 224.0.0.251 和端口 5353,符合 RFC 6762。

别碰 dnspython + 手动构造 mDNS 查询包——它不处理服务实例名解析、TXT 记录解码、缓存逻辑或冲突检测,上线后大概率发现服务“时有时无”。

  • zeroconf 自动处理服务名去重、TTL 刷新、缓存验证,避免重复注册或陈旧记录残留
  • Windows 上需额外安装 pywin32(否则 ServiceBrowser 可能静默失败)
  • macOS 默认启用 avahi-daemon 冲突,建议启动前加 zeroconf=Zeroconf(ip_version=IPVersion.V4Only)

注册服务时 host 参数填什么最安全

填错 host 是服务不可见的第一大原因。它不是“本机 IP”,而是你要对外暴露服务的主机名(hostname),且必须能被局域网其他设备通过 mDNS 解析到 —— 通常就是本机的 .local 名。

运行 hostname 命令看输出(比如 mylaptop.local),就用这个值;如果返回的是纯主机名(如 mylaptop),得手动补 .local。千万别填 127.0.0.1localhost,它们在 mDNS 网络里不生效。

立即学习Python免费学习笔记(深入)”;

中易广告联盟程序
中易广告联盟程序

广告联盟系统: 快速低成本建立您自己的广告联盟中易广告联盟程序是一套适合大型广告联盟系统,结合了盈众科技多年来的联盟系统研发经验,大量各行业广告商和上千家联盟合作的服务经验,精心打造的功能强大、性能卓越的广告联盟系统,支持CPC、CPM、CPS CPA、CPV、富媒体,抗负载性和稳定性极强,实际使用中的单服务器日流量可以达到3000万。 负载能力强,稳定地区,行业等定向超强防作弊技术广告分组计划云

下载
  • 服务注册示例:ServiceInfo(type_="_http._tcp.local.", name="Web Server._http._tcp.local.", addresses=[inet_aton("192.168.1.10")], port=8000, host="mylaptop.local")
  • 若用 get_all_addresses() 自动获取 IP,注意它可能返回多个(如 Docker 网桥、vEthernet),要过滤掉非物理网卡地址
  • Android 设备默认不响应 mDNS 查询,iOS/macOS 则没问题;测试务必用 Mac 或 Linux 机器当客户端

ServiceBrowser 收不到回调?先查这三件事

常见现象是服务明明注册成功,但监听端收不到 add_service 回调。这不是代码写错了,而是网络层或权限问题。

  • 确认 Python 进程有组播接收权限:Linux 上执行 ip link show | grep -A2 multicast,确保主网卡 multicast 标志为 ON
  • 检查防火墙:macOS 的「防火墙选项」里勾选「允许远程登录」会意外阻断 mDNS;Linux 上临时关掉 ufw 测试
  • ServiceBrowser 启动后需保持主线程活跃(不能立即退出),建议用 time.sleep(30)signal.pause() 阻塞,而非 input()(后者在某些 IDE 中会中断信号)

服务名含空格或中文?立刻改掉

mDNS 协议对服务实例名(name 参数)有严格限制:只允许 ASCII 字母、数字、连字符、下划线,且首尾不能是连字符或下划线。空格、中文、括号、点号都会导致注册失败或解析异常,但错误不抛出,只静默忽略。

比如 "My Web Server._http._tcp.local." 会被截断成 "My""服务器._http._tcp.local." 在 macOS 上可能注册成功但 Android 客户端完全看不见。

  • 安全做法:用 re.sub(r"[^a-zA-Z0-9\-_]", "-", name).strip("-_") 清洗服务名
  • TXT 记录值可以含 UTF-8(如 {"version": "1.2.0", "desc": "测试服务"}),但 key 必须是 ASCII
  • 服务类型(type_)末尾的 .local. 不能省略,少一个点就查不到

最麻烦的其实是网络拓扑:同一台路由器下的设备能通,但跨 VLAN、AP 桥接、或用了企业级交换机(默认禁用 IGMP snooping)时,mDNS 组播包根本传不出子网。这时候再怎么调代码都没用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

719

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

719

2023.08.10

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.11.24

常见的编码方式
常见的编码方式

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。想了解更多编码方式相关内容,可以阅读本专题下面的文章。

635

2023.10.24

a和A对应的ASCII码数值
a和A对应的ASCII码数值

a的ascii码是65,a的ascii码是97;ascii码表中,一个字母的大小写数值相差32,一般知道大写字母的ascii码数值,其对应的小写字母的ascii码数值就算出来了,是大写字母的ascii码数值“+32”。想了解更多相关的内容,可阅读本专题下面的相关文章。

2207

2024.10.24

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1256

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1153

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

823

2023.08.01

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号