2010-09-01 41 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上。