灵活、固体和便携式服务的发现
-
05-09-2019 - |
题
我在寻找一种方式为客户在一个局域网,以找到所有的实例,我的服务器应用程序,没有任何配置。而不是攻击自己的东西,我想要使用现有的解决方案。就个人而言,我需要它能做蟒蛇,但我高兴地听到有关解决方案中的任何其他语言。
所以我为什么不用 用则表明 或 OpenSLP 或者一些其他的 零配置/呼 解决方案吗?嗯,有几个额外的标准,我的印象是既没有上述系统相匹配。
我在寻找一个解决方案,即:
- 灵活.它必须不需要超级用户权利,即只使用港口>1024.
- 固体.它必须允许多种服务的相同和不同的服务类型上的一个单一的机器和继续广告的服务,即使实例,开始在广告服务器停止或崩溃。
- 便携式.它必须运行几乎无处不在,或者至少上*BSD,Debian/巴布亚/RedHat/SuSe Linux,Mac OS X,Solaris and Windows NT。
- 光.理想的是,一个Python脚本将是整个解决方案。我不在少感兴趣地址自动配置或类似的东西,尽管我会勉强接受的解决方案具有许多功能,我不需要。此外,任何一个时间设置一个严格没有-没有。
我希望事情是这样的:
def registerService(service): # (type, port)
if listen(multicast, someport):
if fork() == child:
services = [service]
for q in queriesToMe():
if q == DISCOVERY:
answer(filter(q.criteria, services))
elif q == ADVERTISE and q.sender == "localhost":
services.append(q.service)
else:
advertiseAt("localhost", service)
解决方案
我写了一个应用程序/图书馆(目前Python和CLI口)相匹配的所有这些标准.这就是所谓 minusconf.事实证明派生甚至不是必要的。
其他提示
为节点现在LAN我已经使用的扭曲和UDP多播。希望它能帮助你。
链接到扭曲的文件,解释如何做到这一点:https://twistedmatrix.com/documents/current/core/howto/udp.html#auto3
这是一个基本的执行情况的一个服务器/客户基础的扭曲的代码。它回答本身如果你运行一次,但是所有的检查码的和额外的功能被拆除,以便使它更易于阅读。
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
class MulticastPingPong(DatagramProtocol):
MULTICAST_ADDR = ('228.0.0.5', 8005)
CMD_PING = "PING"
CMD_PONG = "PONG"
def startProtocol(self):
"""
Called after protocol has started listening.
"""
# Set the TTL>1 so multicast will cross router hops:
self.transport.setTTL(5)
# Join a specific multicast group:
self.transport.joinGroup(self.MULTICAST_ADDR[0])
self.send_alive()
def send_alive(self):
"""
Sends a multicast signal asking for clients.
The receivers will reply if they want to be found.
"""
self.transport.write(self.CMD_PING, self.MULTICAST_ADDR)
def datagramReceived(self, datagram, address):
print "Datagram %s received from %s" % (repr(datagram), repr(address))
if datagram.startswith(self.CMD_PING):
# someone publishes itself, we reply that we are here
self.transport.write(self.CMD_PONG, address)
elif datagram.startswith(self.CMD_PONG):
# someone reply to our publish message
print "Got client: ", address[0], address[1]
if __name__ == '__main__':
reactor.listenMulticast(8005, MulticastPingPong(), listenMultiple=True)
reactor.run()
我假设你已经控制了该客户的应用程序,而不仅仅是服务器的应用程序,在这种情况下 火 可能会很好的工作。
灵活性: 使用非特权的港口。
固体: 它一直保持良好,为许多年。
便携式: 纯Python和经过良好测试的多平台。
光: 我认为火是光为你在说什么。也许要求一个Python脚本是不现实的一个网的命名服务?
甚至如果你不想实际使用的"远程对象的"范式的火焰兵,你仍然可能只使用它命名服务。
不隶属于 StackOverflow