我正在阅读一本名为“Twisted Network Programming Essentials rev.2”的书,我有一个报价服务器示例的问题。我从书上抄的代码,但是当我启动服务器,然后客户端我有在客户端侧终端的错误:一个TCP报价服务器和客户端在扭曲的Python错误
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)
这里是为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()
我明白,这个问题是我不传递“工厂”参数中的“QuoteProtocol”里面调用“buildProtocol'功能'QuoteClientFactory'类。但我不知道我应该通过那里。此外,我想通了,“QuoteClientFactory”在底部通话还需要第二个参数“报价”,所以我试图把它这样:
for quote in quotes:
reactor.connectTCP("triptrck.com", 8000, QuoteClientFactory(quote))
reactor.run()
结果是出乎意料的,对于我。该错误在客户端侧终端消失了,而不是我有这:
connection lost: Connection was closed cleanly.
connection lost: Connection was closed cleanly.
connection lost: Connection was closed cleanly.
可能有人给我解释一下这是怎么回事?为什么我们需要一个“初始化”与“工厂”和“报价”和我应该通过在那里呢?
PS: 我也有在这本书中第一个例子中的一个问题,回声工厂服务器,由于某种原因,数据不会经历,我已经不得不改变“transport.write'至'sendLine'使用'LineReceiver'而不是'protocol.Protocol'。也许它也必须这样做?