扭曲的transport.write

问题描述 投票:5回答:4

有没有办法强制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|
python ssl tcp twisted
4个回答
2
投票

我使用低级Python 2.6有一些相关的问题。我正在谈论的主机期待一个ACK字符,然后是一个单独的数据缓冲区,它们都是一次性的。除此之外,它是一个TLS连接。但是,如果您直接引用套接字,则可以调用sendall():

self.transport.write(Global.ACK)

至:

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

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


0
投票

你能说出你正在使用哪种运输工具吗?对于大多数实现,这是典型的方法:

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

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


0
投票

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

self.transport.registerProducer(self, False)

然后在你的协议中创建一个写入方法,让它的工作缓冲数据,直到传输调用你的协议resumeProducing方法逐个获取数据。

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

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

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.