socket servidor python3 libreria hilos funciones español crear con comandos cliente python client

servidor - socket en python3



¿El mejor protocolo de cliente/servidor compatible con Python? (11)

Estoy buscando un buen protocolo de servidor / cliente compatible con Python para hacer solicitudes de datos / transferencias de archivos entre un servidor y muchos clientes. La seguridad también es un problema, por lo que un inicio de sesión seguro sería una ventaja. He estado investigando XML-RPC, pero parece ser un protocolo muy antiguo (¿y posiblemente no se usa actualmente?).



Usaría http y comenzaría por comprender lo que ofrece la biblioteca de Python.

Luego me mudaría a la biblioteca Twisted, de mayor fortaleza industrial.


XMLRPC es muy simple para comenzar, y en mi trabajo anterior, lo usamos extensivamente para la comunicación intra-nodo en un sistema distribuido. Siempre que realice un seguimiento del hecho de que el valor Ninguno no se puede transferir fácilmente, es muy fácil trabajar con él y se incluye en la biblioteca estándar de Python.

Ejecútelo sobre https y agregue un parámetro de nombre de usuario / contraseña a todas las llamadas, y tendrá una seguridad simple en su lugar. Sin embargo, no estoy seguro de cuán fácil es verificar el certificado del servidor en Python.

Sin embargo, si está transfiriendo grandes cantidades de datos, la codificación en XML podría convertirse en un cuello de botella, por lo que el uso de una arquitectura inspirada en REST sobre https puede ser tan buena como xmlrpclib.


Pyro (Python Remote Objects) es bastante inteligente si todos sus servidores / clientes van a estar en Python. Sin embargo, uso XMPP mucho, ya que me estoy comunicando con hosts que no siempre son Python. XMPP se presta a ser extendido con bastante facilidad también.

Existe una excelente biblioteca XMPP para Python llamada PyXMPP que está razonablemente actualizada y no depende de Twisted.


HTTP parece adaptarse a sus necesidades y está muy bien soportado en Python.

Twisted es bueno para una programación de red asíncrona seria en Python, pero tiene una curva de aprendizaje abrupta, por lo que valdría la pena usar algo más simple a menos que sepa que su sistema necesitará manejar mucha concurrencia.

Para comenzar, sugeriría usar urllib para el cliente y un servicio WSGI detrás de Apache para el servidor. Apache se puede configurar para tratar HTTPS de manera bastante simple.


ProtocolBuffers fue lanzado por Google como una manera de serializar datos de una forma muy compacta y eficiente. Tienen soporte para C ++, Java y Python. Todavía no lo he usado, pero mirando la fuente, parece haber clientes y servidores RPC para cada idioma.

Personalmente he usado XML-RPC en varios proyectos, y siempre hice exactamente lo que esperaba. Por lo general, iba entre C ++, Java y Python. Utilizo libxmlrpc en Python a menudo porque es fácil de memorizar y escribir de forma interactiva, pero en realidad es mucho más lento que el pyxmlrpc alternativo.

PyAMF es principalmente para RPC con clientes Flash, pero también es un formato RPC compacto que vale la pena mirar.

Cuando tienes Python en ambos extremos, no creo que nada sea mejor que Pyro (Python Remote Objects). Pyro incluso tiene un "servidor de nombres" que permite a los servicios anunciar su disponibilidad a una red. Los clientes usan el servidor de nombres para encontrar los servicios que necesita sin importar dónde estén activos en un momento determinado. Esto le proporciona redundancia gratuita y la capacidad de mover servicios de una máquina a otra sin ningún tiempo de inactividad.

Por seguridad, haría un túnel sobre SSH, o usaría TLS o SSL en el nivel de conexión. Por supuesto, todas estas opciones son esencialmente las mismas, simplemente tienen varias dificultades de configuración.


Si está buscando hacer transferencias de archivos, es probable que XMLRPC sea una mala elección. Se requerirá que codifique todos sus datos como XML (y lo cargue en la memoria).

Las "solicitudes de datos" y las "transferencias de archivos" me parecen mucho más simples que HTTP, pero su declaración del problema no aclara sus requisitos. ¿Qué tipo de información debe codificarse en la solicitud? ¿Sería suficiente una URL como " http://yourserver.example.com/service/request?color=yellow&flavor=banana "?

Hay muchos clientes y servidores HTTP en Python, ninguno de los cuales es especialmente bueno, pero estoy seguro de que todos harán el trabajo para las transferencias de archivos básicas. Puede hacer que la seguridad sea la forma web "normal", que es usar HTTPS y contraseñas, lo que probablemente sea suficiente.

Si desea una comunicación bidireccional, HTTP se cae y un protocolo como el agente de perspectiva (PB) de Twisted o el protocolo de mensajería asíncrona (AMP) pueden ser más adecuados. Estos protocolos son sin duda bien respaldados por Twisted.


Le sugiero que consulte 1. XMLRPC 2. JSONRPC 3. SOAP 4. REST / ATOM XMLRPC es una opción válida. No te preocupes, es demasiado viejo. Eso no es problema. Es tan simple que poco necesita cambiar desde la especificación original. El profesional es que en cada lengua de programación sé que hay una biblioteca para escribir en un cliente. Ciertamente, para Python. Lo hice funcionar con mod_python y no tuve ningún problema. El gran problema con esto es su verbosidad. Para valores simples, hay una gran cantidad de sobrecarga de XML. Puedes descomprimirlo por causa, pero luego pierdes alguna habilidad de depuración con las herramientas como Fiddler.

Mi preferencia personal es JSONRPC. Tiene todas las ventajas de XMLRPC y es muy compacto. Además, los clientes de Javascript pueden "evaluarlo" para que no sea necesario el análisis sintáctico. La mayoría de ellos están diseñados para la versión 1.0 del estándar. He visto diversos intentos de mejorarlo, llamados 1.1 1.2 y 2.0, pero no están construidos uno sobre otro y, que yo sepa, aún no son ampliamente compatibles. 2.0 se ve mejor, pero todavía me quedaría con 1.0 por ahora (octubre de 2008)

El tercer candidato sería REST / ATOM. RESTO es un principio, y ATOM es la forma de transmitir la mayor parte de los datos cuando es necesario para las solicitudes POST, PUT y GET. Para una implementación muy buena, mire GData, la API de Google. Real, realmente agradable.

SOAP es antiguo, y muchas bibliotecas / idiomas lo admiten. Es complicado y complicado, pero si sus clientes principales son .NET o Java, podría valer la pena. Visual Studio importaría su archivo WSDL y crearía una envoltura y, para el programador C #, se vería como un ensamblado local.

Lo bueno de todo esto, es que si diseñas bien tu solución, las bibliotecas existentes para Python te permitirán soportar más de una con casi ningún costo adicional. XMLRPC y JSONRPC son especialmente buenos.

En cuanto a la autenticación. XMLRPC y JSONRPC no se molestan en definir uno. Es algo independiente de la serialización. De modo que puede implementar Autenticación básica, Autenticación implícita o la suya propia con cualquiera de ellas. He visto algunos ejemplos de Autenticación Digest del lado del cliente para Python, pero todavía no he visto el servidor basado en uno. Si usa Apache, es posible que no necesite uno, utilizando mod_auth_digest Apache module en su lugar. Esto depende de la naturaleza de su aplicación

Seguridad del transporte Obviamente es SSL (HTTPS). Actualmente no puedo recordar cómo trata XMLRPC, pero con la implementación de JSONRPC que tengo es trivial: simplemente cambia de http a https en sus URL a JSONRPC y pasará por el transporte habilitado para SSL.


No es necesario usar HTTP (de hecho, HTTP no es bueno para RPC en general en algunos aspectos), y no es necesario utilizar un protocolo basado en estándares si se trata de un cliente python que habla con un servidor python.

Utilice una biblioteca RPC específica de Python, como Pyro, o lo que Twisted proporciona (Twisted.spread).


SSH puede ser una buena opción para la transferencia de archivos y el control remoto, especialmente si le preocupa el inicio de sesión seguro. La mayoría de los servidores Linux y Solaris ya ejecutarán un servicio SSH para la administración, por lo que si su programa Python usa ssh, entonces no necesita abrir puertos o servicios adicionales en máquinas remotas.

OpenSSH es el cliente y servidor SSH estándar y portátil, y se puede utilizar a través de subprocesos de Python. Si desea más flexibilidad Twisted incluye Twisted Conch, que es una implementación de cliente y servidor SSH que proporciona un control flexible programable de una pila SSH, tanto en Linux como en Windows. Yo uso ambos en producción.


El proyecto de ahorro de Facebook puede ser una buena respuesta. Utiliza un protocolo liviano para pasar objetos y le permite usar cualquier idioma que desee. Puede caer en la seguridad, aunque creo que no hay ninguno.