2010-11-22 2 views
1

Ich bin die BuildProtocol-Methode der ServerFactory ändern, im Grunde die Fabrik hört auf Port 11000 und 12000, und ich habe zwei Protokolle, eines für jeden Port Port. Ich versuche den Port abzurufen, den der Client zum Abhören verwendet hat, damit ich das richtige Protokoll instanziieren kann.Abrufen der Abhörport während BuildProtocol

ex. Client hört an Port 11000 zu, Protokoll 1 wird instanziiert. Client hört an Port 12000 ab, Protokoll 2 wird instanziiert.

ich denke, dies kann nur in der buildProtocol stage getan werden, gibt es eine möglichkeit zu bestimmen, welcher port verwendet wurde, um zu verbinden? Der von BuildProtocol verwendete Adressparameter ist die Clientadresse, ich benötige den Serverport.

Pseudocode:

def buildProtocol(self, address): 
    if address connects at port 11000: 
    proto = TransformProtocol() 
    else: 
    proto = TransformProtocol2() 
    proto.factory = self 
    return proto 
+0

Ein kleines Beispiel wäre hilfreich, da es schwierig ist, Ihr Problem zu visualisieren. Es ist auch ein wenig verwirrend, wenn Sie sagen "ex. Client hört Port 11000 ..." Meinst du den Server (im Allgemeinen, Server tun das Zuhören)? – Gerrat

+0

hey gerrat, ja der Server hört bei 11000 und 12000. Was ich möchte, ist separate Protokolle für jeden Port zu haben. Zum Beispiel schreibt protocol1 an Port 11000 den gesamten Text, den der Client sendet, während protocol2 an Port 12000 den gesamten Text, den der Client sendet, in Kleinbuchstaben umwandelt. Im Grunde gibt es also eine Factory-Instanz, aber zwei unterschiedliche Protokolle für jeden die zwei Häfen. – momo

+0

Protokolle haben keinen Bezug zu Ports. Sie sollten Ihre Factory von einer Unterklasse ableiten, um zwei Klassen mit unterschiedlichen Funktionen zu erhalten. Dann binden Sie sie nach Wunsch an Ports. –

Antwort

0

Ich denke, müssen Sie Twisted-Dienste nutzen: link text

code Sie werden so etwas wie:

from twisted.application import internet, service 
from twisted.internet import protocol, reactor 
from twisted.protocols import basic 

class UpperCaseProtocol(basic.LineReceiver): 
    def lineReceived(self, line): 
     self.transport.write(line.upper() + '\r\n') 
     self.transport.loseConnection() 

class LowerCaseProtocol(basic.LineReceiver): 
    def lineReceived(self, line): 
     self.transport.write(line.lower() + '\r\n') 
     self.transport.loseConnection() 

class LineCaseService(service.Service): 

    def getFactory(self, p): 
     f = protocol.ServerFactory() 
     f.protocol = p 
     return f 

application = service.Application('LineCase') 
f = LineCaseService() 

serviceCollection = service.IServiceCollection(application) 
internet.TCPServer(11000,f.getFactory(UpperCaseProtocol)).setServiceParent(serviceCollection) 
internet.TCPServer(12000,f.getFactory(LowerCaseProtocol)).setServiceParent(serviceCollection) 

Aber hier haben wir zwei Factory-Instanzen.

+0

Anatoly hören, Übung Nummer 3: http://krondo.com/?p=2101 – momo

+0

Krondo Einführung in asynchrone Programmierung ist großartig, aber ich denke, meine Lösung ist klarer und Twisted-Stil. Protokoll ist der richtige Ort für spezifische Daten Manipulationslogik (obere, untere). Eine Factory ist der richtige Ort für Daten, die Sie den Protokollinstanzen zur Verfügung stellen möchten, da die Protokollinstanzen nach dem Schließen der Verbindung als Garbage Collection erfasst werden. Versuchen Sie, dieses Beispiel auszuführen: twistd -y server.tac (der Name der Beispieldatei), telnet localhost 11000 –

+0

Sie können auch lesen grad Twisted-Lernprogramm "Twisted From Scratch": http://twistedmatrix.com/documents/current/core /howto/tutorial/index.html –