扭曲的transport.write
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扭曲的transport.write相关的知识,希望对你有一定的参考价值。
有没有办法强制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 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,这似乎不是问题。
你能说出你正在使用哪种运输工具吗?对于大多数实现,这是典型的方法:
def write(self, data):
if data:
if self.writeInProgress:
self.outQueue.append(data)
else:
....
根据细节,可以根据需要更改写入功能的行为。
也许您可以将协议注册为传输的拉动生产者
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)
在写入之间放置相对较长的延迟(10秒)。这将是唯一可行的解决方案。因为如果收件人由那些不知道TCP是什么以及如何使用它的人编写得如此糟糕,那么你很难做任何事情(除了重写该应用程序)。
以上是关于扭曲的transport.write的主要内容,如果未能解决你的问题,请参考以下文章
为什么self.transport.write()写入同一行,即使我在每次调用后引入睡眠后调用它两次?
python twisted 写tcp 客户端 服务器 为啥self.transport.write传送多数据的时候,接受到是一起接受呢