2009-06-01 5 views
11

La question: Comment créer une application python pouvant connecter et envoyer des paquets via Internet à un autre ordinateur exécutant la même application? Existe-t-il un code/une bibliothèque que je pourrais utiliser?Création d'une connexion entre deux ordinateurs en python

L'arrière-plan: Je suis assez nouveau en programmation (HS senior). J'ai créé beaucoup de choses simples en python mais j'ai récemment décidé de commencer un plus gros projet. J'envisage de créer un simulateur de projet de booster Magic: the Gathering, mais je ne suis pas sûr que ce soit faisable compte tenu de mes compétences, alors je demande avant de commencer. L'application devrait envoyer des données entre ordinateurs au sujet des cartes qui sont choisies/passées.

Merci!

Répondre

12

Twisted est un moteur de réseau piloté par événements python sous licence MIT. Signifie qu'une seule machine peut communiquer avec une ou plusieurs autres machines, tout en faisant d'autres choses entre les données reçues et envoyées, toutes de manière asynchrone, et en exécutant un dans un seul thread/processus.

Il prend en charge de nombreux protocoles prêts à l'emploi, vous pouvez donc tout aussi bien en utiliser un existant. C'est mieux parce que vous obtenez le support du protocole de logiciels tiers (c.-à-d. HTTP pour la communication signifie que le logiciel middleware utilisant HTTP sera compatible: proxies, etc.)

Il est également facile de créer son propre protocole de communication, si c'est ce que tu veux. Le documentation est rempli avec des exemples.

3

Un bon endroit pour commencer à regarder est le Python Standard Library. En particulier, il y a quelques sections qui seront pertinentes:

Puisque vous avez mentionné que vous avez aucune expérience avec cela, je vous suggère de commencer par une implémentation basée sur HTTP. Le protocole HTTP est assez simple et facile à utiliser. En outre, il existe de bons cadres pour prendre en charge cette opération, tels que webpy pour le serveur et HTTPLib à partir de la bibliothèque standard pour le client.

Si vous voulez vraiment vous plonger dans la mise en réseau, alors une implémentation basée sur socket pourrait être éducative. Cela vous apprendra les concepts sous-jacents qui sont utilisés dans lots de code réseau tout en résultant dans une interface qui est similaire à un flux de fichier.

+0

Il existe un guide pratique pour les sockets: http://docs.python.org/howto/sockets.html. –

+0

un fort -1 en recommandant des sockets de bas niveau à un débutant. Dans mon expérience avec l'enseignement, enseigner un cadre de haut niveau et ensuite montrer que la mise en œuvre sous-jacente a beaucoup plus de sens que d'enseigner comment le faire mal. – nosklo

+1

Je suppose que cela dépend de ce que l'étudiant cherche à en tirer et de son niveau réel. De mon pov, si je voulais apprendre sur la communication réseau et d'une manière ou d'une autre n'a jamais appris sur les prises, je serais contrarié. Après la formation de la connexion initiale, l'utilisation de sockets n'est que légèrement plus difficile que de lire/écrire un fichier. L'avantage est que l'étudiant peut réfléchir à la façon dont il veut représenter les données. – Doug

7

La bibliothèque standard inclut SocketServer (documenté here), qui peut faire ce que vous voulez.

Cependant, je me demande si une meilleure solution pourrait être d'utiliser une file d'attente de messages. Beaucoup de bonnes implémentations existent déjà, y compris les interfaces Python. J'ai déjà utilisé RabbitMQ auparavant. L'idée est que les ordinateurs s'abonnent tous deux à la file d'attente, et peuvent poster ou écouter des événements.

+1

+1: utilisez une implémentation de n'importe quelle bibliothèque qui peut vous aider. – nosklo

1

La communication se fera avec des prises, d'une manière ou d'une autre. Juste une question de savoir si vous utilisez les bibliothèques de niveau supérieur existantes, ou roulez les vôtres.

Si vous faites cela comme une expérience d'apprentissage, vous voulez probablement commencer aussi bas que possible, pour voir les vrais boulons et écrous. Ce qui signifie que vous voulez probablement commencer par a SocketServer, en utilisant une connexion TCP (TCP est fondamentalement garanti la livraison des données, UDP ne l'est pas).

Google pour un exemple de code simple. L'installation est très facile. Mais vous devrez définir tous les détails de votre protocole de communication: quelle fin envoie quand et quoi, quelle extrémité écoute et quand, à quoi s'attend exactement l'auditeur, répond-il pour confirmer la réception, etc.

+1

-1: Je ne suis pas du tout d'accord avec le fait que voir des douilles et des boulons TCP aidera n'importe quoi. L'utilisation directe du socket vous fera juste apprendre à * NOT * faire votre code. Apprenez plutôt à haut niveau, puis étudiez la bibliothèque que vous avez choisie. – nosklo

+1

Je fais très peu de programmation en C, mais je suis très heureux de le savoir, car cela me permet de mieux comprendre ce que font les langages de haut niveau en coulisses avec de la mémoire et des types de données complexes. Je pense qu'il en va de même pour la programmation des sockets: on ne passerait presque jamais au niveau TCP pour une application de production, mais certains exercices à ce niveau permettent de mieux comprendre ce que font les frameworks de plus haut niveau. –

+0

@ John Pirie: Oui, mais pensez-vous qu'un débutant devrait apprendre C (ou l'assemblage, d'ailleurs) * d'abord *? Je ne pense pas. Je pense que la tendance naturelle est d'apprendre d'abord de haut niveau, puis de descendre autant que nécessaire pour comprendre les concepts de bas niveau plus tard, après que les concepts généraux soient bien appris. Mon point est que le cadre devrait venir en premier. – nosklo

1

Aussi, vérifiez out Pyro (objets distants Python). Se this answer pour plus de détails.

Pyro vous permet essentiellement de publier des instances d'objets Python en tant que services pouvant être appelés à distance. Pyro est probablement le moyen le plus simple d'implémenter la communication de processus Python-python.

1

Il est également intéressant de regarder à Kamaelia pour ce genre de chose - il est d'usage d'origine était les systèmes de réseau, et rend la construction de ces choses relativement intuitive. Certains liens: Overview of basic TCP system, Simple Chat server, Building a layered protocol, walk-through of how to evolve new components. Autre extrême: Système radio P2P: source, peer. Si cela fait une différence, nous avons testé si le système est accessible aux novices en participant 3 ans de suite à google été de code, en prenant en charge activement les développeurs expérimentés et inexpérimentés. Tous ont réussi à construire des systèmes utiles. Essentiellement, si vous avez déjà joué avec des pipelines Unix, les idées devraient être familières.

caveat: J'ai écrit des morceaux importants de Kamaelia :-)

Si vous voulez apprendre comment faire ces choses si, en jouant avec quelques approches différentes est logique, et vous devriez certainement vérifier Twisted (la norme répondre à cette question), Pyro & les outils de la bibliothèque standard. Chacun a une approche différente, et les apprendre vous sera certainement bénéfique! Cependant, à l'instar de nosklo, je recommande de ne pas utiliser directement la librairie de socket et d'utiliser une librairie, simplement parce qu'il est beaucoup plus difficile d'obtenir une programmation de socket correcte que ce que les gens ont tendance à réaliser.