Витой транспорт.пишите - PullRequest
       21

Витой транспорт.пишите

5 голосов
/ 01 сентября 2010

Есть ли способ заставить self.transport.write (ответ) немедленно выполнить запись в его соединение, чтобы следующий вызов self.transport.write (ответ) не буферизовался в тот же вызов.

У нас есть клиент с устаревшим программным обеспечением, которое мы не можем изменить, который читает для 1-го запроса, а затем начинает читать снова, и проблема, которую я имею, состоит в том, что перекручивается, объединяет две записи вместе, что разрушает клиентские идеи, которые я пробовалглядя на отсрочку, но я не думаю, что это поможет в этом случае

Пример:

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 ]

2 голосов
/ 20 июля 2013

У меня была несколько связанная проблема с использованием нижнего уровня Python 2.6. Хост, с которым я говорил, ожидал один символ ACK, а затем отдельный буфер данных, и все они пришли сразу. Наверху из этого это было соединение TLS. Однако, если вы ссылаетесь на сокет ПРЯМО, вы можете вызвать sendall () как:

self.transport.write(Global.ACK)

до:

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

... и это должно сработать. Похоже, что это не проблема для Python 2.7 с Twisted на X86, просто Python 2.6 на процессоре SHEEVAPlug ARM.

0 голосов
/ 21 марта 2019

Возможно, вы можете зарегистрировать свой протокол в качестве источника извлечения для транспорта

self.transport.registerProducer(self, False)

, а затем создать метод записи в вашем протоколе, в котором задание буферизует данные, пока транспорт не вызовет ваш метод resumeProroduction протокола дляизвлекать данные один за другим.

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

def resumeProducing(self):
    data = self._buffers.pop()
    self.transport.write(data)
0 голосов
/ 01 сентября 2010

Можете ли вы сказать, какой транспорт вы используете.Для большинства реализаций это типичный подход:

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

В зависимости от деталей, поведение функции записи может быть изменено для выполнения по желанию.

0 голосов
/ 01 сентября 2010

Установите относительно большую задержку (10 секунд) между записями. Это будет единственно возможным решением. Потому что, если получатель так плохо написан людьми, которые не знают, что такое TCP и как его использовать, вы вряд ли сможете что-либо сделать (кроме как переписать это приложение).

...