2010-09-01 45 views
5

是否有任何方法強制self.transport.write(response)立即寫入其連接,以便下一次調用self.transport.write(response)不會被緩存到同一個調用中。Twisted transport.write

我們有一個客戶端,使用我們無法修改的遺留軟件,讀取第一個請求,然後再次開始閱讀,我遇到的問題是扭曲,將兩個寫入打到一起,打破了客戶端的任何想法, deferreds但我不認爲它會在這種情況下幫助

例子:

self.transport.write("|123|") # amount of messages to follow 
a loop to generate next message 
self.transport.write("|message 1 text here|") 

預計:

|123| 
|message 1 text here| 

結果:

|123||message 1 text here| 
+0

嗨,我知道這是一箇舊帖子,但你能告訴我你做了什麼來解決這個問題嗎? – 2012-04-09 06:24:43

+0

對於它的價值,無法完全可靠地完成這項工作。有一天,你可能會購買一些不同的交換機或路由硬件,並且你的應用會中斷。這個扭曲的常見問題解答試圖解釋:http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#Whyisprotocol.dataReceivedcalledwithwithlylypartatahedataataIdledportport.writewith – Glyph 2013-07-22 21:33:55

回答

-1

在寫入之間放置相對較大的延遲(10秒)。這將是唯一可能的解決方案。因爲如果收件人被不知道TCP是什麼以及如何使用它的人編寫得如此糟糕,你幾乎不能做任何事情(除了重寫該應用程序之外)。

+0

謝謝你的評論,可悲的是仍然是同樣的問題。它顯示扭曲的等待,直到所有的處理過程完成,即使在time.sleep(60)之前發送流量下線。我將不得不看一些其他的實施,以使其工作:( – Jarratt 2010-09-01 13:38:13

+9

反應堆等待,直到你讓它運行任何事情。如果你不讓它運行,它不能做任何事情。time.sleep (60)阻止它運行如果你想在60秒後做其他事情,使用'reactor.callLater(60,somethingElse)' – 2010-10-27 22:07:41

0

你能告訴你正在使用哪種運輸方式嗎?對於大多數實現, 這是典型的方法:

def write(self, data): 
     if data: 
      if self.writeInProgress: 
       self.outQueue.append(data) 
      else: 
       .... 

基於寫入功能的行爲,可以根據需要改變做細節。

+0

目前我使用Twisted SSL來創建一個安全的服務器 – Jarratt 2010-09-02 09:40:57

2

我在使用低級別的Python 2.6時遇到了一些相關的問題。我與之交談的主持人期待着一個單一的ACK字符,然後是一個單獨的數據緩衝區,並且他們都立即出現。在這個頂部 ,這是一個TLS連接。但是,如果直接引用插座,你可以調用 sendall()爲:

self.transport.write(Global.ACK) 

到:

self.transport.getHandle().sendall(Global.ACK) 

...這應該工作。這在Python 2.7上使用Twisted在X86上看起來並不是問題,只是在SHEEVAPlug ARM處理器上的 Python 2.6上。