2011-01-05 12 views
10

Voglio scrivere un server che può accettare più client in python (twistato). Ho già una certa dimestichezza con la programmazione dei socket con il modulo socket python standard, ma qui arriva il problema .. Penso che sia difficile entrare in conflitto e ho letto alcuni tutorial su di esso. Ma una cosa che non riesco a trovare è un semplice server socket che accetta connessioni multiple. Qualcuno può aiutarti? Se ho perso alcune preziose informazioni on-line per favore fatemelo sapere, perché io sto tirando fuori i miei capelli ..Server contorto per più client

Ogni aiuto è molto apprezzato,

Andesay

+0

hai guardato http://stackoverflow.com/questions/1365737/managing-multiple-twisted -client-connections –

+0

Andrew, penso che la domanda sia diversa da quella che Andesay ha chiesto. Sento che la domanda di Andesay è molto di base. Perfavore, correggimi se sbaglio. –

risposta

12

Dire, si desidera eseguire un server che accetta connessioni client sulla porta 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() 

E se si desidera verificare la connessione al server, ecco il codice per un cliente (per lanciare in un terminale diverso):

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

noterete la il codice è molto simile, solo che usiamo una Factory per un server e una ClientFactory per un client, e i server devono ascoltare (listenTCP) mentre il client deve connettersi (connectTCP). In bocca al lupo!

+0

Direi, il codice server in un terminale e aprire più nuovi terminali e provare a connettermi usando 'nc localhost 9000' o' telnet localhost 9000'. L'utilizzo di client standard aiuta prima. –

+0

Grazie per questo fantastico esempio .. Penso che questo fosse proprio quello di cui avevo bisogno .. Ho una domanda però .. Nell'esempio del server sotto "class MyServer (protocol.Protocol)" scrivi un'istruzione di passaggio .. Perché non c'è niente in questa classe? – Andesay

+0

E come potrei fare per inviare e ricevere dati? – Andesay

7

credo, non hai l'essenza della contorta . Se si crea un server socket contorto, è la connessione disponibile predefinita tramite più client. Vorrei suggerire i seguenti tutorial in ordine e poi leggere la documentazione contorta. Scrivi piccoli snippet come indicato in questi tutorial per capire cosa sta realmente accadendo.

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

ritorto è un quadro impressionante, ma questo (come spesso) implica che per cosa facile può essere un molto difficile ...

Ecco il fatto . È necessario scrivere una classe che implementa un Resource, un LineReceiver se avete bisogno, e poi attaccarlo al reattore con:

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

Riflettendo, questa risposta non ha alcun senso. Hai collegato 'risorsa' a 'ClientFactory', e non vedo come 'connectTCP' sia correlato alla domanda del richiedente a * all *; "accetta più client" sembra che il richiedente stia scrivendo un * server * non un client. Le risorse sono legate solo a HTTP, cosa c'entra un 'LineReceiver' con qualcosa e di che classe stai parlando di avere un'istanza di? – Glyph