Pergunta

Eu estou procurando uma maneira para os clientes em uma LAN para encontrar todas as instâncias do meu aplicativo de servidor sem qualquer configuração. Em vez de cortar algo mim, eu gostaria de usar uma solução existente. Pessoalmente, eu preciso dele para ser feito em Python, mas eu feliz ao ouvir sobre soluções em qualquer outra língua.

Então, por que não estou usando avahi ou OpenSLP ou algum outro Zeroconf / SLP solução? Bem, há um par de critérios adicionais, e tenho a impressão de que nenhum dos sistemas acima mencionados combina-los.

Eu estou procurando uma solução que é:

  • flexível . Ele não deve exigir direitos de superusuário, ou seja, só usam portas> 1024.
  • Sólidos . Ele deve permitir que vários serviços do mesmo e diferente tipo de serviço em uma única máquina e continuar anunciando os serviços, mesmo quando a instância que iniciou o anúncio servidor pára ou trava.
  • portátil . Ele deve ser executado quase em toda parte, ou pelo menos no * BSD, Debian / gentoo / RedHat / SuSe Linux, Mac OS X, Solaris e Windows NT.
  • Luz . Idealmente, um script Python seria a solução inteira. Não tenho o menor interesse no endereço autoconfiguração ou algo parecido, embora eu begrudgingly aceitar uma solução que tem muitos recursos que você não precisa. Além disso, qualquer configuração de uma só vez é um não-não estrito.

Eu espero que algo como isto:

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)
Foi útil?

Solução

Eu escrevi um aplicativo / biblioteca (atualmente Python ea interface CLI) que coincide com todos estes critera. É chamado minusconf . Acontece que bifurcação não é mesmo necessário.

Outras dicas

Para a descoberta nó em uma LAN Eu usei Torcido e UDP Multicast. Espero que ajude você também.

Link para a documentação torcida que explica como fazê-lo: https://twistedmatrix.com/documents/current/core/howto/udp .html # auto3

Aqui está uma implementação básica de um servidor / cliente baseado no código da torcida. Ele responde a si mesmo se você executar uma vez, mas todo o código de verificação e recursos extras foram removidos, a fim de torná-lo mais fácil de ler.

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()

Eu suponho que você tem controle sobre os aplicativos do cliente, e não apenas o aplicativo do servidor, no caso Pyro que pode funcionar bem para você.

flexível:. usa portas não privilegiadas

Solid:. Tem sido bem mantida por muitos anos

Portátil:. pura Python e bem testado em múltiplas plataformas

Luz: Acho Pyro é luz para o que você está recebendo. Talvez pedir um script Python é irrealista para um serviço de identificação de rede?

Mesmo se você não quer realmente usar o paradigma "objeto remoto" do Pyro, você ainda pode ser capaz de usar apenas o seu serviço de nomes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top