2009-06-01 61 views
11

La pregunta: ¿Cómo creo una aplicación de Python que pueda conectarse y enviar paquetes a través de Internet a otra computadora que ejecute la misma aplicación? ¿Hay algún código/biblioteca que pueda usar?Crear conexión entre dos computadoras en python

El fondo: soy bastante nuevo en la programación (HS senior). He creado muchas cosas simples en Python, pero recientemente decidí comenzar un proyecto más grande. Estoy considerando crear un simulador de draft booster de Magic: the Gathering, pero no estoy seguro de si es factible dado mi conjunto de habilidades, así que estoy preguntando antes de comenzar. La aplicación necesitaría enviar datos entre computadoras acerca de qué tarjetas están siendo recogidas/aprobadas.

Gracias!

Respuesta

12

Twisted es un motor de red basado en eventos python con licencia bajo MIT. Significa que una sola máquina se puede comunicar con una o más máquinas, mientras hace otras cosas entre los datos que se reciben y se envían, todo de forma asíncrona y ejecutando una en un único subproceso/proceso.

Admite muchos protocolos de fábrica, por lo que puede utilizar uno ya existente. Eso es mejor porque obtiene soporte para el protocolo de un software de terceros (es decir, usar HTTP para comunicación significa software de middleware que usa HTTP será compatible: proxies, etc.)

También hace que sea fácil crear su propio protocolo de comunicación, si eso es Lo que quieras.

El documentation está lleno de ejemplos.

3

Un buen lugar para empezar a buscar es el Python Standard Library. En particular, hay algunas secciones que serán relevantes:

Puesto que usted ha mencionado que no tiene experiencia con esto, me gustaría sugerir a partir de una implementación basada en HTTP. El protocolo HTTP es bastante simple y fácil de usar. Además, hay marcos agradables para admitir esta operación, como webpy para el servidor y HTTPLib de la biblioteca estándar para el cliente.

Si realmente desea sumergirse en la creación de redes, entonces una implementación basada en socket podría ser educativa. Esto le enseñará los conceptos subyacentes que se usan en lotes del código de red mientras que da como resultado una interfaz que es similar a una secuencia de archivos.

+0

Hay un útil método para enchufes: http://docs.python.org/howto/sockets.html. –

+0

a fuerte -1 en recomendar tomas de bajo nivel a un principiante. En mi experiencia con la enseñanza, enseñe un marco de alto nivel y luego demuestre que la implementación subrayada tiene mucho más sentido que enseñar cómo hacerlo mal. – nosklo

+1

Supongo que depende de lo que el estudiante esté buscando para salir de él y en qué nivel están realmente. Desde mi punto de vista, si quisiera aprender acerca de la comunicación de red y de alguna manera nunca aprendí sobre enchufes, me enojaría. Después de que se forma la conexión inicial, usar sockets es solo un poco más difícil que leer/escribir un archivo. El beneficio es que el alumno piense cómo quiere representar los datos. – Doug

7

La biblioteca estándar incluye SocketServer (documentado here), que puede hacer lo que quiera.

Sin embargo, me pregunto si una mejor solución podría ser utilizar una cola de mensajes. Ya existen muchas implementaciones buenas, incluidas las interfaces de Python. He usado RabbitMQ antes. La idea es que las computadoras se suscriban a la cola y puedan publicar o escuchar eventos.

+1

+1: utilice una implementación de cualquier biblioteca que pueda ayudarlo – nosklo

1

La comunicación se realizará con enchufes, de una forma u otra. Solo se trata de si usa bibliotecas existentes de nivel superior o si usa las propias.

Si estás haciendo esto como una experiencia de aprendizaje, probablemente quieras comenzar tan bajo como puedas, para ver los aspectos prácticos. Lo que significa que probablemente desee comenzar con a SocketServer, usando una conexión TCP (TCP básicamente garantiza la entrega de datos; UDP no).

Google para obtener un código de ejemplo simple. Configurar uno es muy fácil. Pero deberá definir todos los detalles de su protocolo de comunicaciones: qué extremo envía cuándo y qué, qué extremo escucha y cuándo, qué espera exactamente el oyente, responde para confirmar el recibo, etc.

+1

-1: Estoy totalmente en desacuerdo con ver que los conectores TCP tuercas y tornillos ayuden a cualquier cosa. Usar el socket directamente solo te hará aprender a * NO * hacer tu código. Simplemente aprende alto nivel en su lugar, y luego estudia la biblioteca que elijas. – nosklo

+1

Hago muy poca programación en C, pero estoy muy contento de saberlo, porque me da una mayor profundidad de comprensión sobre qué idiomas de alto nivel están haciendo detrás de escena con memoria y tipos de datos complejos. Creo que lo mismo es cierto para la programación de socket: casi nunca se pasa al nivel de TCP para una aplicación de producción, pero algunos ejercicios a ese nivel proporcionan una mayor comprensión de lo que están haciendo los frameworks de nivel superior. –

+0

@John Pirie: Sí, pero ¿crees que un novato debería aprender C (o ensamblaje, para el caso) * primero *? No lo creo. Creo que la tendencia natural es aprender primero de alto nivel, y luego bajar tanto como sea necesario para comprender los conceptos de bajo nivel más adelante, después de que los conceptos generales hayan sido bien aprendidos. Mi punto es que el marco debe ser lo primero. – nosklo

1

Además, verifique Pyro (objetos remotos de Python). Se this answer para más detalles.

Pyro básicamente le permite publicar instancias de objetos de Python como servicios que se pueden llamar de forma remota. Pyro es probablemente la forma más fácil de implementar la comunicación de proceso de Python a Python.

1

También vale la pena mirar Kamaelia para este tipo de cosas - su uso original fue de sistemas de red, y hace que la construcción de tales cosas sea relativamente intuitiva. Algunos enlaces: Overview of basic TCP system, Simple Chat server, Building a layered protocol, walk-through of how to evolve new components. Otro extremo: sistema de radio P2P: source, peer.

Si hace alguna diferencia, hemos probado si el sistema es accesible para los principiantes mediante la participación en google summer of code durante 3 años consecutivos, asumiendo activamente tanto a los desarrolladores experimentados como a los inexpertos. Todos ellos lograron construir sistemas útiles.

Esencialmente, si alguna vez jugaste con tuberías de Unix, las ideas deberían ser familiares.

Advertencia: Escribí grandes trozos de kamaelia :-)

Si usted desea aprender cómo hacer estas cosas, sin embargo, jugando con algunos enfoques diferentes tiene sentido, y que debería salir torcida (el estándar responder a esta pregunta), Pyro & las herramientas de biblioteca estándar. ¡Cada uno tiene un enfoque diferente, y aprenderlos definitivamente te beneficiará!

Sin embargo, al igual que nosklo, recomendaría no usar la biblioteca de socket directamente y usar una biblioteca en su lugar, simplemente porque es mucho más difícil obtener la programación correcta de lo que las personas tienden a darse cuenta.

Cuestiones relacionadas