要使用 DNS Service Discovery (DNS-SD) 注册多个服务,您可以通过创建多个服务条目来实现。以下是一个使用 Python 和 Avahi(在 Linux 系统中)注册多个服务的示例。
1. 安装必要的库
确保您已安装了 dbus
和 gi
,它们通常与 Linux 的 D-Bus 系统一起提供。若没有,可以通过包管理器安装。
2. 编写注册多个服务的脚本
下面是一个示例脚本,通过 Avahi 注册两个不同的 HTTP 服务:
import dbus
import dbus.mainloop.glib
from gi.repository import GLib
def register_service(service_name, service_type, service_port):
bus = dbus.SystemBus()
# 使用 Avahi D-Bus 接口
avahi_server = bus.get_object("org.freedesktop.Avahi.Server", "/")
entry_group = bus.get_object("org.freedesktop.Avahi.EntryGroup", avahi_server.NewEntryGroup())
entry_group = dbus.Interface(entry_group, "org.freedesktop.Avahi.EntryGroup")
# 注册服务
entry_group.AddService(
'my_host', # 主机名
service_name,
0, # Flags (通常为0)
service_port,
[], # TXT记录(可选)
'', # Group name (通常为空)
'local' # 区域名称
)
entry_group.Commit()
def main():
services = [
{"name": "My HTTP Service 1", "type": "_http._tcp", "port": 8080},
{"name": "My HTTP Service 2", "type": "_http._tcp", "port": 8081}
]
for service in services:
register_service(service["name"], service["type"], service["port"])
# 主循环以保持程序运行并处理回调。
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
loop = GLib.MainLoop()
main()
loop.run()
3. 执行脚本
将上述代码保存为 register_services.py
文件,并执行:
sudo python register_services.py
4. 验证服务是否发布成功
和之前一样,在同一网络中的其他设备上,可以使用命令行工具,比如 avahi-browse
来验证所有已注册的服务:
avahi-browse -r _http._tcp --resolve
这会列出所有已注册的 _http._tcp
类型的服务,包括我们刚才注册的两个。
注意事项
- 如果需要为每个服务添加 TXT 记录,可以在调用
AddService()
时,将相应信息传递给第四个参数。 - 确保你的系统具备足够权限,以便于执行 D-Bus 操作,通常需要 root 权限或合适的用户组权限。
- 在生产环境中,考虑错误处理和异常捕获,以保证脚本稳定性。
内容由零声教学AI助手提供,问题来源于学员提问