2017-08-16 158 views
0

我正在阅读一本名为“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'。也许它也必须这样做?

回答

0

行,所以我想通了,最初的错误是因为这是报价“在“reactor.connectTCP”缺失造成的。但仍存在'transport.write'的问题仍然无法正常工作。

更新:刚才注意到,我写了“qoute”,而不是在quoteserver.py报价”,所以这个问题是我的疏忽