代码之家  ›  专栏  ›  技术社区  ›  Mark Harrison

通过zeroconf/bonjour发布最简单的方法?

  •  13
  • Mark Harrison  · 技术社区  · 15 年前

    我有一些应用程序想用zeroconf显示。

    1. 有没有一个简单的脚本化的方法来做到这一点?
    2. 网络管理员是否需要执行任何操作才能启用此功能?

    首选python或sh。欢迎针对Linux和OS X的操作系统特定建议。

    4 回复  |  直到 8 年前
        1
  •  9
  •   Zack    8 年前

    或者您可以使用bash:

    dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]
    

    这在OS X上默认工作。对于其他*尼克斯,请参阅 avahi-publish 手册页(您可能需要通过首选软件包管理器安装)。

        2
  •  8
  •   Alex Martelli    15 年前

    我建议 pybonjour .

        3
  •  8
  •   Cameron Lowell Palmer    8 年前

    Pybonjour似乎没有得到积极的维护。我在用 python-zeroconf .

    pip install zeroconf
    

    这是我用来宣布 Twisted-Autobahn WebSocket 到iOS设备:

    from zeroconf import ServiceInfo, Zeroconf
    
    class WebSocketManager(service.Service, object):
        ws_service_name = 'Verasonics WebSocket'
        wsPort = None
        wsInfo = None
    
        def __init__(self, factory, portCallback):
            factory.protocol = BroadcastServerProtocol
            self.factory = factory
            self.portCallback = portCallback
            self.zeroconf = Zeroconf()
    
        def privilegedStartService(self):
            self.wsPort = reactor.listenTCP(0, self.factory)
            port = self.wsPort.getHost().port
    
            fqdn = socket.gethostname()
            ip_addr = socket.gethostbyname(fqdn)
            hostname = fqdn.split('.')[0]
    
            wsDesc = {'service': 'Verasonics Frame', 'version': '1.0.0'}
            self.wsInfo = ServiceInfo('_verasonics-ws._tcp.local.',
                                      hostname + ' ' + self.ws_service_name + '._verasonics-ws._tcp.local.',
                                      socket.inet_aton(ip_addr), port, 0, 0,
                                      wsDesc, hostname + '.local.')
            self.zeroconf.register_service(self.wsInfo)
            self.portCallback(port)
    
            return super(WebSocketManager, self).privilegedStartService()
    
        def stopService(self):
            self.zeroconf.unregister_service(self.wsInfo)
    
            self.wsPort.stopListening()
            return super(WebSocketManager , self).stopService()
    
        4
  •  1
  •   jldupont    15 年前

    通过 Avahi Python bindings 很简单。