2010-09-01 4 views
5

Existe-t-il un moyen de forcer self.transport.write (réponse) à écrire immédiatement sur sa connexion afin que l'appel suivant à self.transport.write (réponse) ne soit pas mis en mémoire tampon dans le même appel.Twisted transport.write

Nous avons un client avec un logiciel hérité que nous ne pouvons pas modifier, qui lit pour la première demande et recommence à lire, et le problème que j'ai est tordu joint les deux écritures qui casse le client toutes les idées que j'ai essayées deferreds mais je ne pense pas que cela vous aidera dans ce cas

Exemple:

self.transport.write("|123|") # amount of messages to follow 
a loop to generate next message 
self.transport.write("|message 1 text here|") 

attendu:

|123| 
|message 1 text here| 

Résultat:

|123||message 1 text here| 
+0

Salut, je sais que c'est un vieux post mais pouvez-vous me dire qu'avez-vous fait pour résoudre ce problème? –

+0

Pour ce que ça vaut, il est impossible de faire ce travail complètement fiable. Un jour, vous pourriez acheter un matériel de commutation ou de routage différent et votre application va se casser. Cette FAQ Twisted tente d'expliquer: http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#Whyisprotocol.dataReceivedcalledwithonlypartofthedataIcalledtransport.writewith – Glyph

Répondre

-1

Mettez un délai relativement important (10 secondes) entre les écritures. Ce sera la seule solution possible. Parce que si le destinataire est si mal écrit par des gens qui ne savent pas ce qu'est TCP et comment l'utiliser, vous pouvez à peine faire n'importe quoi (autre que réécrire cette application).

+0

Merci pour votre commentaire, malheureusement toujours le même problème. Il semble attendre que tout le traitement soit terminé même avec un time.sleep (60) avant d'envoyer du trafic sur la ligne. Je vais devoir examiner une autre implémentation pour que cela fonctionne :( – Jarratt

+9

Le réacteur attend que vous l'ayez laissé faire quoi que ce soit, si vous ne le laissez pas fonctionner, il ne peut rien faire. (60) Si vous voulez faire autre chose après 60 secondes, utilisez 'reactor.callLater (60, somethingElse)' –

0

Pouvez-vous dire quel transport vous utilisez. Pour la plupart des implémentations, Cette approche est typique:

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

Selon les détails du comportement de la fonction d'écriture peut être modifiée pour faire comme vous le souhaitez.

+0

Actuellement j'utilise Twisted SSL pour créer un serveur sécurisé – Jarratt

2

J'avais un problème lié à l'utilisation de Python 2.6. L'hôte à qui je parlais attendait un seul caractère ACK, et puis un tampon de données séparé, et ils sont tous venus à la fois. En plus, c'était une connexion TLS. Toutefois, si vous faites référence à la prise DIRECTEMENT, vous pouvez appeler un Sendall() comme:

self.transport.write(Global.ACK) 

à:

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

... et cela devrait fonctionner. Cela ne semble pas être un problème sur Python 2.7 avec Twisted sur X86, juste Python 2.6 sur un processeur ARM SHEEVAPlug.