2010-08-29 6 views
1

Je suis nouveau à la programmation de réseau mais vieux à Python. J'ai un programme de buvard simple qui doit être utilisé sur plusieurs ordinateurs clients. Le buvard fonctionne de deux façons, il peut afficher et mettre à jour les informations dans la base de données. Pour éviter que des buvards ne montrent d'anciennes données, comment puis-je faire en sorte que tous les buvards récupèrent les informations de la base de données dès qu'un autre buvard a mis à jour certaines données dans la base de données?Garder plusieurs clients affichant des informations à jour en Python?

Je préférerais éviter la complexité de la mise en place d'un protocole client-serveur. Est-il possible de créer une certaine forme de protocole client-seul où un simple message d'actualisation est transmis directement aux autres buvards quand ils ont besoin de mettre à jour leurs informations?

+0

quelle est la logique actuelle son script python? – shahjapan

+0

N'avez pas vraiment cette question. – c00kiemonster

+0

Quelle est la fréquence des changements? L'ensemble de données est-il le même pour tous les buvards? Blotter enregistre un paramètre de la source de données ou un nouvel ensemble de données de plusieurs valeurs? Pourriez-vous élaborer la nature de l'information? –

Répondre

0

Pour recevoir des messages (par exemple, le package UDP suggéré par l'autre affiche ou une requête http), les clients doivent exécuter un serveur de base sur la machine client. Vous pouvez utiliser le module Python xmlrpc par exemple. Cependant, un pare-feu local peut bloquer la communication interne. La solution la plus simple, si le nombre de clients est modéré, sera d'interroger fréquemment la base de données pour les changements: ajoutez une colonne "heure de dernière modification" à votre table de dessin et demandez aux clients de cocher cette case. De cette façon, les clients peuvent savoir s'ils doivent recharger le dessin sans gaspiller trop de ressources. Editer: Le dernier champ de modification peut soit être mis à jour activement par le client qui a modifié le dessin, soit être automatiquement mis à jour par un déclencheur de base de données.

+0

Une question, puis-je exécuter un serveur de socket (je suppose que c'est de cela que vous parlez) sur chaque client (ordinateur)? Ne devrais-je pas avoir un serveur de socket, et alors beaucoup de clients de douille possibles? – c00kiemonster

+0

Les serveurs écoutent sur un socket pour les connexions entrantes, les clients établissent ces connexions. Bien sûr, vous pouvez implémenter un seul serveur en Python et vous y connecter à plusieurs reprises pour voir s'il y a un message d'un autre client, mais vous pouvez faire la même chose avec la base de données. Pour éviter les connexions fréquentes, vous avez besoin d'une architecture différente: vos instances d'application de dessin écoutent les connexions entrantes et mettent à jour leur dessin si elles reçoivent un message pour le faire. Au démarrage, ils doivent s'abonner au fil de nouvelles, par exemple en ajoutant leur adresse à une table de base de données. – Jojo

+0

Dans votre implémentation, considérez également ce qui se passe si un client est inactif ou inaccessible et que les messages ne peuvent pas être remis. C'est peut-être pourquoi l'autre affiche a suggéré UDP (au lieu de TCD). Cependant, notez que les paquets UDP peuvent être perdus. J'irais avec la solution "dernière modification" à moins qu'il y ait de très bonnes raisons. – Jojo

0

Vous pouvez utiliser des déclencheurs. Quand une information est mise à jour, envoyez un signal (à vous de choisir comment, peut-être juste un paquet udp) à tous les buvards qui mettront à jour leurs informations conséquentiellement. Postgresql pourrait être scripté en utilisant python.

Questions connexes