2010-07-14 24 views
3

J'essaie de transporter des données entre le serveur et le client mis en œuvre avec torsadé. Autant que je sache, l'utilisation de self.transport.write ([data]) ne fonctionnera que si les données sont une chaîne. Y a-t-il un autre moyen d'envoyer un objet d'un autre type? Je vous remercie!envoyer des données entre le serveur et le client en tordu

Répondre

7

Les supports portent des octets. C'est le seul genre de chose qu'ils portent. Deux extrémités d'une connexion TCP peuvent uniquement transmettre des octets les uns aux autres.

Les octets ne sont pas la structure de données la plus utile pour toutes les formes de communication. Donc au-dessus de ce transport d'octets, nous inventons des schémas pour le formatage et l'interprétation des octets. Ce sont des protocoles. Twisted représente des protocoles en tant que classes, sous-classes toujours twisted.internet.protocol.Protocol, qui implémentent un schéma particulier.

Ces classes ont des méthodes pour transformer quelque chose qui n'est pas un octet pur en un octet pur. Par exemple, twisted.protocols.basic.NetstringReceiver est une implémentation du netstring protocol. Il transforme un nombre particulier d'octets en octets qui représentent à la fois le nombre d'octets et les octets eux-mêmes. C'est un protocole plutôt subtil, car il n'est pas évident que le nombre d'octets est une information qui doit être transmise aussi.

Ces classes interprètent également les octets reçus du réseau, dans leur méthode dataReceived, selon le protocole qu'ils implémentent, et transforment l'information résultante en quelque chose de plus structuré. NetstringReceiver utilise les informations de longueur pour accepter exactement le bon nombre d'octets du réseau, puis les remet à son rappel stringReceived sous la forme d'une seule instance Python str.

D'autres protocoles font plus de NetstringReceiver. Par exemple, twisted.protocols.ftp inclut une implémentation du protocole FTP. FTP est un protocole orienté vers le passage des listes de fichiers et des fichiers sur une socket (ou plusieurs sockets, en fait). twisted.mail.pop3 implémente POP3, un protocole de transfert d'e-mails sur des sockets.

Il y a beaucoup, beaucoup de protocoles différents parce qu'il y a beaucoup, beaucoup de choses différentes que vous pourriez vouloir faire. En fonction de ce que vous essayez de faire exactement, il existe probablement différentes manières de convertir des octets vers et depuis des octets pour rendre les choses plus faciles ou plus rapides ou plus robustes (et ainsi de suite). Il n'y a donc pas de protocole unique idéal pour le cas général. Cela inclut le cas de "l'envoi d'un objet", puisque les objets peuvent prendre plusieurs formes différentes, et il peut y avoir plusieurs raisons différentes que vous voulez leur envoyer, et de nombreuses façons différentes de gérer des choses comme la mutation d'un objet précédemment envoyé, et ainsi de suite.

Vous voulez probablement passer un peu de temps à réfléchir au type de communication dont vous avez besoin. Ceci devrait suggérer certaines choses au sujet du protocole que vous choisirez pour faire la communication. Par exemple, si vous voulez pouvoir appeler des méthodes sur des objets Python qui existent de l'autre côté d'une connexion, alors Twisted Spread peut être intéressant.

Si vous voulez quelque chose au lieu interlangage, et seulement besoin de transmettre des types simples, comme des entiers, des chaînes et des listes, puis XML-RPC (Twisted How-To) pourrait être un meilleur ajustement.

Si vous avez besoin d'un protocole plus efficace que XML-RPC et prenant en charge la sérialisation de types plus complexes, alors AMP est peut-être plus approprié.

Et la liste continue.:)

+1

c'est génial, merci! – Thien