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?