Pregunta

Estoy buscando una manera para que los clientes en una red LAN para encontrar todas las instancias de mi aplicación de servidor sin ningún tipo de configuración. En lugar de cortar algo a mí mismo, me gustaría utilizar una solución existente. En lo personal, necesito que se haga en Python, pero me gustaría feliz de escuchar acerca de las soluciones en cualquier otro idioma.

Entonces, ¿por qué no estoy usando avahi o OpenSLP o algún otro Zeroconf / SLP solución? Bueno, hay un par de criterios adicionales, y estoy bajo la impresión de que ninguno de los sistemas mencionados anteriormente ellos se corresponda.

Estoy buscando una solución que es:

  • flexible . No debe requerir derechos de superusuario, es decir, sólo se utilizan los puertos> 1024.
  • Sólido . Se debe permitir que varios servicios de la misma y diferente tipo de servicio en una sola máquina y continuar con la publicidad de los servicios, incluso cuando la instancia que se inició el servidor anuncio se detiene o se bloquea.
  • Portable . Se debe ejecutar en casi todas partes, o por lo menos en * BSD, Debian / gentoo / RedHat / SuSE Linux, Mac OS X, Solaris y Windows NT.
  • luz . Idealmente, una secuencia de comandos de Python sería la solución completa. No estoy en absoluto interesado en la configuración automática de direcciones o algo así, aunque me acepto a regañadientes una solución que tiene un montón de características que no necesito. Por otra parte, ningún tipo de configuración de una sola vez es una estricta no-no.

Me esperaba algo como esto:

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

Solución

escribí una aplicación / biblioteca (actualmente Python y la interfaz CLI) que coincide con todos estos critera. Se llama minusconf . Resulta bifurcación no es ni siquiera necesario.

Otros consejos

Para el descubrimiento de nodo en una red LAN que he usado trenzado y UDP Multicast. Espero que le ayuda también.

Enlace a la documentación retorcido que explica cómo hacerlo: https://twistedmatrix.com/documents/current/core/howto/udp .html # auto3

Esta es una implementación básica de un servidor / cliente basado en el código del torcido. Responde a sí mismo si se ejecuta una vez, pero todo el código de comprobación y características adicionales se eliminaron a fin de que sea más fácil de leer.

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

Asumo que tiene el control sobre las aplicaciones del cliente, no sólo la aplicación de servidor, en cuyo caso Pyro podría funcionar bien para usted.

Flexible:. utiliza puertos no privilegiados

sólidos: ha sido bien mantenido durante muchos años

.

Portátil:. Python puro y bien probado en múltiples plataformas

Luz: Creo Pyro es la luz de lo que está recibiendo. Tal vez pidiendo un script Python es poco realista para un servicio de nombres de red?

Incluso si usted no desea utilizar realmente el paradigma "objeto remoto" En la huida, todavía podría ser capaz de simplemente utilizar su servicio de nombres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top