2011-01-05 1 views
10

Ich möchte einen Server schreiben, der mehrere Clients in Python akzeptieren kann (verdreht). Ich bin schon ziemlich vertraut mit der Socket-Programmierung mit dem Standard-Python-Socket-Modul, aber hier kommt das Problem .. Ich denke, Twisted ist wirklich schwer zu bekommen und ich habe ein paar Tutorials darüber gelesen. Aber eine Sache, die ich nicht wirklich finden kann, ist ein einfacher Socket-Server, der mehrere Verbindungen akzeptiert .. Kann jemand helfen? Wenn ich einige wertvolle Informationen online verpasst bitte lassen Sie mich wissen, weil ich mir die Haare am herausziehen ..Twisted Server für mehrere Clients

Jede Hilfe sehr geschätzt wird,

Andesay

+0

Sieht man bei http://stackoverflow.com/questions/1365737/managing-multiple-twisted -client-connections –

+0

Andrew, ich denke, diese Frage unterscheidet sich von dem, was Andesay gefragt hat. Ich fühle diese Frage von Andesay auf einer sehr grundlegenden Ebene. Bitte korrigieren Sie mich, wenn ich falsch liege. –

Antwort

12

Sagen Sie, Sie möchten einen Server zu akzeptieren Client-Verbindungen auf Port laufen 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() 

Und wenn Sie auf diesem Server eine Verbindung testen möchten, hier ist der Code für einen Client (in einem anderen Terminal starten):

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

Sie werden das merken Code ist sehr ähnlich, nur wir verwenden eine Factory für einen Server und eine ClientFactory für einen Client, und die Server müssen zuhören (listenTCP), während der Client eine Verbindung herstellen muss (connectTCP). Viel Glück!

+0

Ich würde sagen, der Server-Code in einem Terminal und öffnen mehrere neue Terminals und versuchen, eine Verbindung mit 'NC Localhost 9000' oder' Telnet Localhost 9000'. Die Verwendung von Standard-Clients hilft zuerst. –

+0

Danke für dieses tolle Beispiel .. Ich denke, das war genau das, was ich gebraucht habe. Ich habe aber eine Frage. Im Serverbeispiel unter "Klasse MyServer (Protokoll.Protokoll)" schreibst du eine Pass-Anweisung. Warum ist nichts drin diese Klasse? – Andesay

+0

Und wie würde ich Daten senden und empfangen? – Andesay

7

glaube ich, nicht das Wesen der verdrehten bekommen haben . Wenn Sie einen Twisted-Socket-Server erstellen, ist die Verbindung standardmäßig über mehrere Clients verfügbar. Ich würde die folgenden Tutorials in der richtigen Reihenfolge vorschlagen und dann die verdrehte Dokumentation lesen. Schreibe kleine Snippets wie in diesen Tutorials, um zu verstehen, was tatsächlich passiert.

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

Verdreht ist ein fantastischer Rahmen, aber das (wie oft) bedeutet, dass für eine einfache Sache, die es schwer, ein recht sein kann ...

Hier ist die Tatsache, . Sie müssen eine Klasse schreiben, die eine Resource, ein LineReceiver implementiert, wenn Sie brauchen, und es dann mit dem Reaktor befestigen:

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

Nach der Reflexion macht diese Antwort überhaupt keinen Sinn. Sie haben 'Ressource' mit 'ClientFactory' verknüpft, und ich sehe nicht, wie 'connectTCP' mit der Frage des Fragestellers bei * all * zusammenhängt; "accept multiple clients" klingt so, als ob der Fragesteller einen * Server * und keinen Client schreibt. Ressourcen beziehen sich nur auf HTTP, was hat ein 'LineReceiver' mit irgendetwas zu tun, und über welche Klasse sprichst du eine Instanz von? – Glyph