2010-09-01 19 views
5

self.transport.write (response) öğesinin bağlantısına hemen yazılmasını zorlamanın bir yolu var, böylece self.transport.write (response) için bir sonraki çağrı aynı aramaya arabelleğe alınmaz.Twisted transport.write

Düzeltemeyeceğimiz eski yazılımları olan bir istemcimiz var, bu da 1. istek için okuyup tekrar okumaya başlıyor ve sahip olduğum sorun, iki yazıyı bir araya getiriyor. deferreds ama bu durumda yardımcı olacaktır sanmıyorum

Örnek: Beklenen

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| 

Sonuç:

|123||message 1 text here| 
+0

Merhaba, bunun eski bir yazı olduğunu biliyorum ama bana bu sorunu çözmek için ne yaptığınızı söyleyebilir misiniz? –

+0

Değeri için, bu çalışmayı tamamen güvenilir bir şekilde yapmak imkansız. Bir gün farklı anahtar veya yönlendirme donanımı satın alabilir ve uygulamanız kırılır. Bu Twisted SSS açıklamaya çalışmaktadır: http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#Whyisprotocol.dataReceivedcalledwithonlypartodahakkındakullanılmıştransport.writewith – Glyph

cevap

-1

Yazımlar arasında nispeten büyük bir gecikme (10 saniye) koyun. Bu tek çözüm olacak. Çünkü alıcı, TCP'nin ne olduğunu ve nasıl kullanılacağını bilmeyen kişiler tarafından çok kötü yazılıyorsa, neredeyse hiçbir şey yapamazsınız (uygulamayı yeniden yazmanın dışında).

+0

Yorumunuz için teşekkür ederiz, ne yazık ki hala aynı sorun. Çizgiyi aşmadan önce tüm işlem bittiğinde bir time.sleep (60) ile bitene kadar bükülmüş bekler görünür. Bunu çalıştırmak için başka bir uygulamaya bakmak zorunda kalacağım :( – Jarratt

+9

Reaktör, bir şey yapmasına izin verene kadar bekler. Çalışmasına izin vermezseniz, hiçbir şey yapamaz. (60) çalışmasını engeller 60 saniye sonra başka bir şey yapmak isterseniz, 'reactor.callLater (60, bir şeyElse)' kullanın –

0

Kullandığınız aktarımı anlatabilir misiniz?

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

yazma fonksiyonu davranışı istenen şekilde yapmak için değiştirilebilir ayrıntılarına dayanıldığında: en uygulamalar için, Tipik bir yaklaşımdır.

+0

Şu anda güvenli bir sunucu oluşturmak için Twisted SSL kullanıyorum – Jarratt

2

Python 2.6 alt seviyesini kullanarak biraz ilgili bir problem yaşıyordum. Konuştuğum ev sahibi tek bir ACK karakteri bekliyordu ve daha sonra ayrı bir veri tamponu ve hepsi bir kerede geldi. Bunun üstündeki , TLS bağlantısıydı.

self.transport.write(Global.ACK) 

için: Eğer DOĞRUDAN yuva başvuru Ancak, siz bir Sendall() çağırabileceği

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

... ve çalışması gerekir. Bu, X86'da Twisted ile Python 2.7'de bir sorun değil, bir SHEEVAPlug ARM işlemcisindeki sadece Python 2.6.

İlgili konular