2009-04-22 13 views
3

Je travaille sur un programme client-serveur pour la première fois, et je me sens terriblement inadéquat pour savoir par où commencer ce que je fais.Comment transférer des données binaires avec Python?

Je vais utiliser Google Protocol Buffers pour transférer des données binaires entre mon client et mon serveur. Je vais utiliser la variante Python. L'idée de base, si je comprends bien, est que le client sérialisera les données, les enverra au serveur, qui désérialisera alors les données. Le problème est, je ne sais vraiment pas par où commencer pour envoyer des données binaires au serveur. J'espérais que ce serait quelque chose de "simple" comme une requête HTTP, mais j'ai cherché dans Google des moyens de transférer des données binaires et de me perdre dans la multitude de tutoriels, de guides et de documentation. Je ne peux même pas dire si j'aboie le mauvais arbre en enquêtant sur les transferts HTTP (j'espérais l'utiliser, donc je pourrais faire un cran au HTTPS si la sécurité est nécessaire). Je ne veux vraiment pas avoir à passer au niveau de la programmation de sockets, cependant - je voudrais utiliser les bibliothèques disponibles avant de passer à cela. (Je préférerais aussi les bibliothèques Python standard, bien que la librairie tierce soit parfaite.)

Donc, si quelqu'un a un bon point de départ (ou veut s'expliquer un peu lui-même) sur comment un bon façon de transférer des données binaires via Python, je serais reconnaissant. Le serveur que je suis en train d'exécuter Apache avec mod_python, en passant.

+0

Je ne suis pas sûr de ce que vous entendez par "données binaires". Sérialiser les données signifie les rendre binaires, et désérialiser cela signifie le déballer dans un format plus utile. Pourriez-vous élaborer sur les données particulières que vous éprouvez des difficultés à sérialiser? – Jorenko

Répondre

4

Chaque fois que vous allez déplacer des données binaires d'un système à un autre, vous devez garder à l'esprit quelques points.

Différentes machines stockent les mêmes informations différemment. Cela a une implication à la fois dans la mémoire et sur le réseau. Plus d'informations ici (http://en.wikipedia.org/wiki/Endianness)

Parce que vous utilisez python, vous pouvez vous couper ici (en supposant que le client et le serveur seront tous les deux en python) et simplement utiliser cPickle pour sérialiser vos données. Si vous voulez vraiment binaire, vous allez devoir vous familiariser avec le module struct de python (http://docs.python.org/library/struct.html). Et apprenez à emballer/déballer vos données.

Je commencerais par utiliser des serveurs de protocole de ligne simples jusqu'à ce que vous ayez dépassé la difficulté de la communication réseau. Si vous ne l'avez jamais fait avant, cela peut devenir très confus. Comment émettre des commandes, comment transmettre des données, comment resynchroniser des erreurs etc ...

Si vous connaissez déjà les bases de la conception de protocole client/serveur, pratiquez d'abord l'empaquetage et le déballage des structures binaires sur votre disque. Je me réfère également aux RFC de HTTP et FTP pour les cas comme celui-ci.

------- EDITER SUR LA BASE DE COMMENTAIRES -------- Normalement ce genre de chose est fait en envoyant au serveur un "en-tête" qui contient une somme de contrôle pour le fichier ainsi que le taille du fichier en octets. Notez que je ne veux pas dire un en-tête HTTP, vous pouvez le personnaliser comme vous le souhaitez. La chaîne d'événements doit aller quelque chose comme ça ...

CLIENT: "UPLOAD acbd18db4cc2f85cedef654fccc4a4d8 253521" 
SERVER: "OK" 
(server splits the text line to get the command, checksum, and size) 
CLIENT: "010101101010101100010101010etc..." (up to 253521 bytes) 
(server reasembles all received data into a file, then checksums it to make sure it matches the original) 
SERVER: "YEP GOT IT" 
CLIENT: "COOL CYA" 

Ceci est trop simplifié, mais je l'espère, vous pouvez voir ce dont je parle ici.

+0

J'ai déjà les données (disons dans un fichier) - la question est vraiment, comment puis-je transférer le fichier? (Je suppose que j'ai rendu le son plus compliqué que je n'aurais dû en parlant de données binaires, mais le transfert de fichiers est ce que je voulais dire.) –

3

Je ne suis pas sûr d'avoir bien compris votre question, mais peut-être pouvez-vous jeter un coup d'œil au twisted project. Comme vous pouvez le voir dans la FAQ, "Twisted est un moteur de réseau écrit en Python, supportant de nombreux protocoles, il contient un serveur web, de nombreux clients de chat, des serveurs de chat, des serveurs de messagerie, et bien plus encore. un certain nombre de sous-projets auxquels il est possible d'accéder individuellement [...] ".

La documentation est plutôt bonne, et il y a beaucoup d'exemples sur Internet. J'espère que cela aide.

1

Je suppose que cela dépend de votre attachement aux tampons de protocole de Google, mais vous voudrez peut-être vérifier Thrift.

Thrift est un cadre logiciel pour services linguistiques cross évolutifs développement. Il combine un logiciel pile avec un moteur de génération de code pour services de construction qui fonctionnent efficacement et en toute transparence entre C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, cacao, Smalltalk et OCaml.

Voici un bon exemple pour démarrer sur leur page d'accueil.

0

Une question rapide: pourquoi binaire? La charge utile est-elle binaire ou préférez-vous simplement un format binaire? Si c'est le cas, il est également possible d'utiliser le codage base64 avec JSON ou XML; il utilise plus d'espace (~ 34%), et a un peu plus de temps de traitement, mais pas forcément assez important pour de nombreux cas d'utilisation.

Questions connexes