¿Progtwigción del servidor cliente en python?

Aquí está el código fuente para el servidor multithreaed y el cliente en Python.

En el código, el cliente y el servidor cierran la conexión una vez finalizado el trabajo. Quiero mantener las conexiones activas y enviar más datos a través de las mismas conexiones para evitar la sobrecarga de cerrar y abrir sockets cada vez .

El siguiente código es de: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/

import pickle import socket import threading # We'll pickle a list of numbers: someList = [ 1, 2, 7, 9, 0 ] pickledList = pickle.dumps ( someList ) # Our thread class: class ClientThread ( threading.Thread ): # Override Thread's __init__ method to accept the parameters needed: def __init__ ( self, channel, details ): self.channel = channel self.details = details threading.Thread.__init__ ( self ) def run ( self ): print 'Received connection:', self.details [ 0 ] self.channel.send ( pickledList ) for x in xrange ( 10 ): print self.channel.recv ( 1024 ) self.channel.close() print 'Closed connection:', self.details [ 0 ] # Set up the server: server = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) server.bind ( ( '', 2727 ) ) server.listen ( 5 ) # Have the server serve "forever": while True: channel, details = server.accept() ClientThread ( channel, details ).start() 

 import pickle import socket import threading # Here's our thread: class ConnectionThread ( threading.Thread ): def run ( self ): # Connect to the server: client = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) client.connect ( ( 'localhost', 2727 ) ) # Retrieve and unpickle the list object: print pickle.loads ( client.recv ( 1024 ) ) # Send some messages: for x in xrange ( 10 ): client.send ( 'Hey. ' + str ( x ) + '\n' ) # Close the connection client.close() # Let's spawn a few threads: for x in xrange ( 5 ): ConnectionThread().start() 

Generar un nuevo hilo para cada conexión es una muy mala elección de diseño. ¿Qué pasa si te golpean muchas conexiones?

De hecho, usar subprocesos para esperar la E / S de red no vale la pena. Su progtwig se vuelve realmente complejo y no obtiene absolutamente ningún beneficio ya que la espera de la red en subprocesos no lo hará esperar más rápido . Solo pierdes usando hilos en este caso.

El siguiente texto es de la documentación de python:

Solo hay dos formas de hacer que un progtwig en un solo procesador haga “más de una cosa a la vez”. La progtwigción de subprocesos múltiples es la forma más sencilla y popular de hacerlo, pero existe otra técnica muy diferente que le permite tiene casi todas las ventajas de los subprocesos múltiples, sin utilizar realmente varios subprocesos. En realidad, solo es práctico si su progtwig está en gran parte vinculado a E / S. Si su progtwig está enlazado a un procesador, los subprocesos progtwigdos preventivos son probablemente lo que realmente necesita. Sin embargo, los servidores de red rara vez están vinculados al procesador.

Y si es un caso de servidor vinculado procesador. Siempre se puede dejar otro proceso / subproceso para hacer la parte del procesador. Continuo:

Si su sistema operativo admite la llamada al sistema seleccionado en su biblioteca de E / S (y casi todos lo hacen), entonces puede usarlo para hacer malabarismos con varios canales de comunicación a la vez; realizar otro trabajo mientras su E / S se está realizando en el “fondo”. Aunque esta estrategia puede parecer extraña y compleja, especialmente al principio, es mucho más fácil de entender y controlar que la progtwigción de múltiples subprocesos.

Entonces, en lugar de usar hilos, use la entrada / salida sin locking: recopile los sockets en una lista y use un bucle de eventos con select.select para saber qué socket tiene datos para leer. Hacer eso en un solo hilo.

Podría elegir un marco de red asíncrono de Python como retorcido para hacerlo por usted. Eso te ahorrará muchos dolores de cabeza. El código de Twisted se ha mejorado durante años y cubre algunos casos de esquina que le tomará tiempo dominar.

EDITAR : Cualquier biblioteca de E / S asíncrona existente (como Twisted) es un código de Python. Podrías haberlo escrito tú mismo, pero ya ha sido escrito para ti. No veo por qué no usarías una de esas bibliotecas y escribirías tu propio código peor , ya que eres un principiante. Networing IO es difícil de hacer bien.

No estoy seguro de entender la pregunta, pero no llame a close() si no desea cerrar la conexión …

Para ver un ejemplo de un cliente, mantiene abierta la conexión TCP y usa un protocolo familiar, mire la fuente del módulo telnetlib . (lo siento, alguien más tendrá que responder a sus preguntas sobre el enhebrado).

Un ejemplo de un servidor que mantiene una conexión TCP abierta está en la fuente del módulo SocketServer (cualquier instalación estándar de Python incluye la fuente).