2017-08-16 5 views
0

Ich gehe durch ein Buch namens "Twisted Network Programming Essentials rev.2" und ich habe ein Problem mit Beispiel von Zitat Server. Ich habe den Code aus dem Buch kopiert, aber wenn ich Server starten und dann Client ich einen Fehler in clientseitigen Anschluss habe:Ein TCP-Quote Server und Client in Twisted Python Fehler

Traceback (most recent call last): 
    File "quoteclient.py", line 45, in <module> 
    reactor.connectTCP("triptrck.com", 8000, QuoteClientFactory()) 
TypeError: __init__() takes exactly 2 arguments (1 given) 

Hier ist der Code für den quoteclient.py:

from twisted.internet import protocol, reactor 

class QuoteProtocol(protocol.Protocol): 
    def __init__(self, factory): 
     self.factory = factory 

    def connectionMade(self): 
     self.sendQuote() 

    def sendQuote(self): 
     self.transport.write(self.factory.quote) 

    def dataReceived(self, data): 
     print "Received quote:", data 
     self.transport.loseConnection() 

class QuoteClientFactory(protocol.ClientFactory): 
    def __init__(self, quote): 
     self.quote = quote 

    def buildProtocol(self, addr): 
     return QuoteProtocol(self) 

    def clientConnectionFailed(self, connector, reason): 
     print "connection failed:", reason.getErrorMessage() 
     maybeStopReactor() 

    def clientConnectionLost(self, connector, reason): 
     print "connection lost:", reason.getErrorMessage() 
     maybeStopReactor() 

def maybeStopReactor(): 
    global quote_counter 
    quote_counter -= 1 
    if not quote_counter: 
     reactor.stop() 

quotes = [ 
    "You snooze you lose", 
    "The early bird gets the worm", 
    "Carpe diem" 
] 

quote_counter = len(quotes) 

for quote in quotes: 
    reactor.connectTCP("triptrck.com", 8000, QuoteClientFactory()) 
reactor.run() 

ich verstehe, dass das Problem ist, ich bin nicht ein 'Fabrik' Parameter in der 'QuoteProtocol' Anruf innen 'buildProtocol vorbei 'Funktion von' QuoteClientFactory 'Klasse. Aber ich habe keine Ahnung, was ich da reingehen soll. Ich dachte auch, dass ‚QuoteClientFactory‘ Ruf im Boden auch einen zweiten Parameter benötigen würde ‚Zitat‘, so habe ich versucht, es zu setzen wie folgt aus:

for quote in quotes: 
    reactor.connectTCP("triptrck.com", 8000, QuoteClientFactory(quote)) 
reactor.run() 

Das Ergebnis war unerwartet, für mich. Der Fehler in clientseitige Terminal verschwunden, stattdessen habe ich diese bekam:

connection lost: Connection was closed cleanly. 
connection lost: Connection was closed cleanly. 
connection lost: Connection was closed cleanly. 

Könnte mir jemand erklären, was los ist? Warum brauchen wir, dass ‚ init‘ mit ‚Fabrik‘ und ‚Zitat‘ und was soll ich dort passieren?

PS: ich auch ein Problem in ersten Beispiel in dem Buch gehabt haben, das Echo Fabrik-Server, wo aus irgendeinem Grund die Daten nicht durchgehen würde, und ich habe ändern 'transport.write 'zu' sendLine 'mit' LineReceiver 'anstelle von' Protokoll.Protokoll '. Vielleicht muss es damit auch etwas anfangen?

Antwort

0

Ok, so habe ich herausgefunden, dass die anfänglichen Fehler wegen dieses 'Zitat' in 'reactor.connectTCP' verursacht fehlte. Aber das Problem mit 'transport.write' funktioniert nicht korrekt.

AKTUALISIERT: Just bemerkt jetzt, dass ich schrieb 'qoute' statt 'Zitat' in quoteserver.py, so dass das Problem meine Unaufmerksamkeit war