2017-08-16 4 views
0

Je passe par un livre appelé "Twisted Network Programming Essentials rev.2" et j'ai un problème avec l'exemple de serveur de devis. J'ai copié le code du livre, mais quand je lance le serveur et client, je vais avoir une erreur dans le terminal côté client:Un serveur de devis TCP et le client en erreur Python Twisted

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) 

Voici le code pour le 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() 

Je comprends que le problème est que je ne passe pas une « usine » paramètre dans la « QuoteProtocol » appel intérieur 'buildProtocol 'fonction de' QuoteClientFactory 'classe. Mais je n'ai aucune idée de ce que je devrais passer là-bas. Je pensais aussi que « QuoteClientFactory » appel dans le fond aurait également besoin d'un second paramètre « quote », donc je l'ai essayé de le mettre comme ça:

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

Le résultat était inattendu, pour moi. L'erreur dans le terminal côté client a disparu, au lieu que j'ai ce:

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

Quelqu'un pourrait me expliquer ce qui se passe? Pourquoi avons-nous besoin que « init » avec « usine » et « citation » et que dois-je passer là-dedans?

PS: J'ai aussi eu un problème dans le premier exemple dans le livre, le serveur d'usine d'écho, où certaines données pour la raison ne passerait pas par et j'ai dû changer 'transport.write 'à' sendLine 'en utilisant' LineReceiver 'au lieu de' protocole.Protocol '. Peut-être que ça doit faire quelque chose avec ça aussi?

Répondre

0

Ok, donc je me suis dit que l'erreur initiale a été causé à cause de cette « citation » manquant dans « reactor.connectTCP ». Mais toujours le problème avec 'transport.write' ne fonctionne pas correctement persiste.

mise à jour: En ce moment remarqué que je l'ai écrit « qoute » au lieu de « citation » dans quoteserver.py, de sorte que le problème était mon manque d'attention