2011-01-05 35 views
10

Quiero escribir un servidor que pueda aceptar varios clientes en python (retorcido). Ya estoy bastante familiarizado con la programación de socket con el módulo de socket python estándar, pero aquí viene el problema ... Creo que twisted es realmente difícil de conseguir y he leído algunos tutoriales al respecto. Pero una cosa que realmente no puedo encontrar es un servidor de socket simple que acepte conexiones múltiples ... ¿Alguien puede ayudar? Si me perdí alguna información valiosa en línea por favor hágamelo saber, porque yo estoy tirando de mi pelo ..Servidor trenzado para varios clientes

Cualquier ayuda es muy apreciada,

Andesay

+0

¿Has mirado en http://stackoverflow.com/questions/1365737/managing-multiple-twisted -client-connections –

+0

Andrew, creo que esa pregunta es diferente de lo que pidió Andesay. Siento la pregunta de Andesay en un nivel muy básico. Por favor, corríjame si estoy equivocado. –

Respuesta

12

Digamos, que desea ejecutar un servidor que acepta conexiones de cliente en el puerto 9000:

from twisted.internet import reactor, protocol 

PORT = 9000 

class MyServer(protocol.Protocol): 
    pass 

class MyServerFactory(protocol.Factory): 
    protocol = MyServer 

factory = MyServerFactory() 
reactor.listenTCP(PORT, factory) 
reactor.run() 

Y si desea probar la conexión a este servidor, aquí está el código para un cliente (para poner en marcha en un terminal diferente):

from twisted.internet import reactor, protocol 

HOST = 'localhost' 
PORT = 9000 

class MyClient(protocol.Protocol): 
    def connectionMade(self): 
     print "connected!" 

class MyClientFactory(protocol.ClientFactory): 
    protocol = MyClient 

factory = MyClientFactory() 
reactor.connectTCP(HOST, PORT, factory) 

reactor.run() 

se dará cuenta de la el código es muy similar, solo usamos Factory para un servidor y ClientFactory para un cliente, y los servidores necesitan escuchar (listenTCP) mientras el cliente necesita conectarse (connectTCP). ¡Buena suerte!

+0

Diría que el código del servidor en un terminal abre múltiples terminales nuevas y trata de conectarse usando 'nc localhost 9000' o' telnet localhost 9000'. El uso de clientes estándar primero ayuda. –

+0

Gracias por este increíble ejemplo ... Creo que esto era justo lo que necesitaba ... Tengo una pregunta, sin embargo ... En el ejemplo del servidor en "clase MyServer (protocol.Protocol)" escribes una declaración de pase ... ¿Por qué no hay nada en ¿esta clase? – Andesay

+0

¿Y cómo podría enviar y recibir datos? – Andesay

7

Creo, que no recibió la esencia de trenzado . Si crea un servidor de socket retorcido es por defecto la conexión disponible a través de múltiples clientes. Sugeriría los siguientes tutoriales en orden y luego leería la documentación retorcida. Escriba pequeños fragmentos como se indica en estos tutoriales para comprender lo que realmente está sucediendo.

  1. Dave Peticola's twisted tutorial
  2. Itamar Shtull-Trauring's twisted presentation
0

Twisted es un marco impresionante, pero esto (como a menudo) implica que por lo fácil que puede ser un muy difícil ...

Aquí está el hecho . Usted tiene que escribir una clase que implementa un Resource, un LineReceiver si es necesario y, a continuación, adjuntarlo al reactor con:

reactor.connectTCP(<HOST>, <PORT>, istance_of_your_class) 
+1

Después de reflexionar, esta respuesta no tiene ningún sentido. Has vinculado 'resource' a 'ClientFactory', y no veo cómo 'connectTCP' está relacionado con la pregunta del asker en * all *; "aceptar clientes múltiples" parece que el solicitante está escribiendo un * servidor * no un cliente. Los recursos están relacionados solo con HTTP, ¿qué tiene que ver un 'LineReceiver' con algo, y con qué clase estás hablando de tener una instancia? – Glyph

Cuestiones relacionadas