2012-09-30 121 views
2

混亂的行爲,我想學習蟒蛇絞網絡框架,但有一兩件事讓我感到困惑。通過telnet初步測試表明,每當它接收數據的protocol.Protocol.dataReceived()方法被調用。所以,如果我這樣定義它,它等待的EOL發射前:dataReceived()方法蟒蛇扭曲的框架

def dataReceived(self, data): 
    print "MyProtocol::dataReceived, (%s)" %(data) 

輸出:

MyProtocol::dataReceived, (dgdfg 
) 

但是,只要我添加一個額外的行:

def dataReceived(self, data): 
    print "MyProtocol::dataReceived, (%s)" %(data) 
    self.transport.write(data) 

它爲每個角色開火。

輸出:

MyProtocol::dataReceived, (d) 
MyProtocol::dataReceived, (g) 
MyProtocol::dataReceived, (d) 
MyProtocol::dataReceived, (f) 
MyProtocol::dataReceived, (g) 
MyProtocol::dataReceived, (
) 

在這裏發生了什麼任何想法?

工廠protocol.Factory且協議爲protocol.Protocol

由於之前dataReceived火災(docs

回答

2

行緩衝不會發生,所以也不能保證您收到的是EOL分隔。這是不太可能你的問題的根源,雖然,因爲您發送的郵件適合在默認讀取塊大小。你可能會分享你的其他代碼嗎?

有一個LineReceiver協議,你可以看看(docs),照顧你的線路緩衝。以下是一個示例:

from twisted.internet import reactor 
from twisted.protocols import basic 

class EchoLine(basic.LineReceiver): 
    delimiter = '\n' # default is '\r\n' 

    def lineReceived(self, line): 
     print("received: %s" % line) 
     self.sendLine(line) 

class EchoFactory(protocol.ServerFactory): 
    protocol = EchoLine 

reactor.listenTCP(port, EchoFactory()) 
reactor.run() 
1

您使用的客戶端有時在發送之前進行線路緩衝。也許你兩個客戶端之間切換,以獲得緩衝行爲的差異,或許你切換客戶端緩衝選項。