【问题标题】:Twisted transport.write扭曲的transport.write
【发布时间】:2011-04-06 18:21:26
【问题描述】:

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

我们有一个客户端使用我们无法修改的遗留软件,它读取第一个请求,然后再次开始读取,我遇到的问题是扭曲的两个写入连接在一起,这破坏了客户端我尝试过的任何想法延迟但我认为在这种情况下它不会有帮助

例子:

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|

【问题讨论】:

  • 嗨,我知道这是一篇旧帖子,但你能告诉我你是怎么解决这个问题的吗?
  • 无论如何,要让这项工作完全可靠是不可能的。有一天,您可能会购买一些不同的交换机或路由硬件,而您的应用程序将会崩溃。这个 Twisted FAQ 试图解释:twistedmatrix.com/trac/wiki/…

标签: python ssl tcp twisted


【解决方案1】:

我在使用较低级别的 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。

【讨论】:

    【解决方案2】:

    您能说出您使用的是哪种交通工具吗?对于大多数实现, 这是典型的做法:

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

    根据详细信息,可以根据需要更改写入函数的行为。

    【讨论】:

    • 目前我正在使用 Twisted SSL 创建安全服务器
    【解决方案3】:

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

    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)
    

    【讨论】:

      【解决方案4】:

      在写入之间设置一个相对较大的延迟(10 秒)。这将是唯一可能的解决方案。因为如果收件人写得这么糟糕,那些不知道 TCP 是什么以及如何使用它的人,你几乎无能为力(除了重写那个应用程序)。

      【讨论】:

      • 感谢您的评论,遗憾的是还是同样的问题。在发送流量之前,即使使用 time.sleep(60) ,它也会等待所有处理完成。我将不得不查看其他一些实现以使其正常工作:(
      • 反应堆一直等到你让它运行做任何事情。如果你不让它运行,它什么也做不了。 time.sleep(60) 阻止它运行。如果您想在 60 秒后执行其他操作,请使用 reactor.callLater(60, somethingElse)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多