bonjour API参考全解publish、find、Service与Browser完全速查手册【免费下载链接】bonjourA Bonjour/Zeroconf protocol implementation in JavaScript项目地址: https://gitcode.com/gh_mirrors/bo/bonjourbonjour 是一个用纯 JavaScript 实现的 Bonjour / ZeroconfmDNS服务发现库让你的 Node.js 程序无需手动配置 IP就能在局域网中自动发布与发现服务。本文带你快速上手它的核心 APIpublish发布服务、find与findOne发现服务并附Service与Browser两大对象的完整属性、事件速查表。一分钟快速上手bonjour 安装与最小示例安装方式二选一npm 安装或克隆源码npm install bonjourgit clone https://gitcode.com/gh_mirrors/bo/bonjour最小示例——发布一个 HTTP 服务同时发现局域网里的所有 HTTP 服务var bonjour require(bonjour)() // 发布服务在 3000 端口广播一个 http 服务 bonjour.publish({ name: My Web Server, type: http, port: 3000 }) // 发现服务监听局域网中所有 http 服务 bonjour.find({ type: http }, function (service) { console.log(发现服务, service.host : service.port) })如何初始化 Bonjour 实例参数与内部结构var bonjour require(bonjour)([options])直接require(bonjour)()即可零配置使用入口逻辑在index.js。可选的options会透传给底层 multicast-dns 服务器如ip、port、multicast: false适合在测试中指定监听地址。一个实例内部由两部分组成mDNS 服务器封装lib/mdns-server.js与服务注册表lib/registry.js。publish 方法完全解析参数逐项速查var service bonjour.publish(options)发布一个局域网服务并返回Service实例。参数速查表参数类型必填说明namestring✅服务名称如My Web Servertypestring✅服务类型如http、printerportnumber✅服务监听端口hoststring❌主机名/IP默认本机 hostnameprotocolstring❌tcp默认或udpsubtypesstring[]❌服务子类型数组txtobject❌以 TXT 记录广播的键值对 服务类型命名可参考 IANA 官方维护的服务类型与端口号列表即_http._tcp这类命名规则。发布流程见 lib/registry.js探测 probe先发 3 轮探测包确认服务名没被占用间隔 250ms公告 announce立即广播然后按 3s → 9s → 27s 指数退避重播最长间隔 1 小时首次广播成功后触发up事件service.published变为true。名字冲突怎么办若网段内已有同名服务本服务会自动停止并触发error事件Service name is already in use on the networkvar service bonjour.publish({ name: foo, type: bar, port: 3000 }) service.on(up, function () { console.log(服务已上线) }) service.on(error, function (err) { console.error(发布失败, err.message) })服务优雅下线unpublishAll、stop 与 destroyAPI作用bonjour.unpublishAll([callback])下线当前实例发布的全部服务并向网络广播 goodbye 消息TTL0全部下线后触发回调service.stop([callback])只下线单个服务service.start()重新发布服务bonjour.destroy()销毁 mDNS 实例并关闭 UDP 套接字建议程序退出前调用find 方法完全解析如何持续监听局域网服务var browser bonjour.find(options[, onup])开始监听网络上广播的服务返回Browser实例第二个参数onup等价于注册up事件监听器。选项全部可选选项说明type只发现指定类型服务如http省略时执行通配搜索发现一切服务name精确匹配某个服务名subtypes子类型过滤protocol默认tcptxt传入{ binary: true }可保留二进制 TXT 记录var browser bonjour.find({ type: http }) browser.on(up, function (service) { console.log(上线, service.name) }) browser.on(down, function (service) { console.log(下线, service.name) }) browser.stop() // 不再需要时停止监听findOne 速查如何只取第一个匹配的服务var browser bonjour.findOne(options[, callback])—— 找到第一个匹配的服务后自动停止浏览并回调不提供 callback 时需自行监听up事件bonjour.findOne({ type: http }, function (service) { console.log(第一个 HTTP 服务, service.fqdn) })Browser 对象速查表start、stop、update 与 up/down 事件Browser 是一个事件对象实现见lib/browser.js内部维护一份当前在线服务列表成员类型说明browser.services数组当前在线的全部服务browser.start()方法开始或恢复搜索browser.stop()方法停止搜索browser.update()方法立即重新广播一次查询事件up回调每发现一个新服务时触发参数为 service事件down回调服务发出 goodbye下线时触发Service 对象速查表发现到的服务长什么样无论是自己publish返回的服务还是find发现的服务字段都一致实现见lib/service.js属性说明示例name服务名Apple TVtype服务类型httpprotocol协议tcphost主机名或 IP192.168.1.5port端口5000fqdn完整域名Apple TV._http._tcp.localtxtTXT 键值对可能为null{ path: / }subtypes子类型数组可能为null_ipps._tcpaddresses发现的 IP 地址列表[192.168.1.5]published是否已发布发布侧有效trueService 事件up服务成功发布上线时触发error发布过程出错通常是服务名已被占用。常见坑与排查找不到服务、名字冲突怎么解决现象原因与解法error报 Service name is already in use网段内已有同名服务换个 name或先排查占用者发现不到服务确认两端在同一局域网/子网且 type 拼写一致、protocol 一致默认tcp测试时干扰真实网络初始化传multicast: false并指定ip/port写法可参考test/bonjour.js进程退出后广播残留退出前调用bonjour.destroy()关闭 UDP 套接字项目模块结构一览源码去哪看文件职责index.jsBonjour 入口组合出 publish / find / findOne / destroy 等公共 APIlib/registry.js服务注册表probe 探测、announce 公告、goodbye 下线逻辑lib/browser.jsBrowser 实现PTR 查询、up/down 事件分发lib/service.jsService 对象构建 PTR / SRV / TXT / A 记录lib/mdns-server.jsmulticast-dns 封装负责应答 mDNS 查询test/bonjour.js、test/service.js各 API 的测试用例可直接当使用示例参考一句话总结5 个方法 2 个对象发布bonjour.publish({ name, type, port })→ 拿到Service监听up/error事件发现bonjour.find({ type })持续监听bonjour.findOne({ type }, cb)只取第一个收尾service.stop()/bonjour.unpublishAll()优雅下线bonjour.destroy()关闭套接字。掌握这 5 个方法和 2 个对象你就拥有了 bonjour 服务发现的完整能力地图。【免费下载链接】bonjourA Bonjour/Zeroconf protocol implementation in JavaScript项目地址: https://gitcode.com/gh_mirrors/bo/bonjour创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考