扭曲的transport.write

时间:2010-09-01 11:38:29

标签: python ssl tcp twisted

有没有办法强制self.transport.write(响应)立即写入其连接,以便下一次调用self.transport.write(响应)不会被缓冲到同一个调用中。

我们有一个客户端,我们无法修改遗留软件,读取第一个请求,然后再次开始阅读,我遇到的问题是加在一起的两个写入,这打破了客户端我试图调查延迟的任何想法但我认为在这种情况下它不会有所帮助

示例:

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|

4 个答案:

答案 0 :(得分:2)

我在使用低级Python 2.6时遇到了一些问题。我正在谈论的主机期待一个ACK字符,然后是一个单独的数据缓冲区,它们都是一次性的。在上面 这是一个TLS连接。但是,如果您直接引用套接字,则可以调用a sendall()as:

self.transport.write(Global.ACK)

为:

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

......那应该有用。这在使用X86上的Twisted的Python 2.7上似乎不是问题 SHEEVAPlug ARM处理器上的Python 2.6。

答案 1 :(得分:0)

您能告诉您正在使用哪种运输工具。对于大多数实现, 这是典型的方法:

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

根据细节,可以根据需要更改写入功能的行为。

答案 2 :(得分:0)

也许您可以将协议注册为运输的拉动生产者

self.transport.registerProducer(self, False)

,然后在具有工作缓冲的协议中创建一个write方法 数据,直到传输调用协议的resumeProducing方法来获取 数据一个接一个。

def write(self, data):
    self._buffers.append(data)

def resumeProducing(self):
    data = self._buffers.pop()
    self.transport.write(data)

答案 3 :(得分:-1)

在写入之间放置相对较长的延迟(10秒)。这将是唯一可行的解​​决方案。因为如果收件人由那些不知道TCP是什么以及如何使用它的人编写得如此糟糕,那么你很难做任何事情(除了重写该应用程序)。