Reseau en python

Cyril - 24 mars 2004 à 16:15
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 -
J'aimerais savoir comment est il possible d'envoyer autre chose qu'une chaine de caractere genre un tableau?

10 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 662
24 mars 2004 à 17:59
Voilà un exemple:
Le client a un objet de type liste, et il l'envoie au serveur qui est en écoute sur le port 9999:

Le serveur (server.py):
# -*- coding: iso-8859-1 -*-
# Le serveur qui reçoit l'objet sur le port 9999
import socket, pickle
# Le serveur se met en écoute sur le port 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 9999))
s.listen(1)
conn, addr = s.accept() # ici, accept() est bloquant
data = ''
# Et le serveur reçoit les données (éventuellement par petits bouts)
while 1:
    paquet = conn.recv(1024)
    if not paquet: break
    data += paquet
conn.close()
# Le serveur dé-sérialise l'objet et l'affiche
nouvelleliste = pickle.loads(data)
print nouvelleliste


Et le client (client.py):
# -*- coding: iso-8859-1 -*-
# Le client qui envoie sur le port 9999
import socket,pickle
maliste = ['toto','titi',23,'Hello, world !'] # La liste à envoyer
# Je convertis maliste en suite d'octets
data = pickle.dumps(maliste)
# Je l'envoie au serveur
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 9999))
s.send(data)
s.close()


Lance d'abord le serveur, puis le client.
Le serveur affichera la liste envoyée par le client.


Quelques remarques:
- la gestion de la boucle réseau est ici assez mauvaise (pas de gestion d'erreur, gère une seule connexion, etc.)
- il faut faire un try/except sur pickle.loads()
- pickle.loads() peut poser des problèmes de sécurité.
- Pas la peine de réinventer la roue: Il existe de librairies qui simplifie grandement le passage d'objets en réseau, comme http://pyro.sourceforge.net/


:-)
5
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 662
24 mars 2004 à 16:47
Bah oui pas de problème.

Quand tu ouvre un socket, tu peux balancer absolument tout ce que tu veux dedans !

Je te donne même un truc: en utilisant pickle() ça te permet de transférer des objets Python par le réseau (que ça soit une string, un tableau, une liste, un fichier, ou n'importe quel objet plus complexe)
2
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 662
24 mars 2004 à 17:43
pickle() permet de transformer (pratiquement) n'importe quel objet Pyhton en suite d'octets.
Cette suite d'octets peut être enregistrée dans un fichier, ou envoyée par réseau, ou même stockée dans une base de données.

En dé-picklant cette suite d'octets, on récupère l'objet qu'on peut continuer à utiliser.

C'est un moyen comme un autre d'envoyer quelquechose par réseau.

Si j'ai le temps je te ferai un petit d'exemple pour envoyer quelquechose par réseau.
2
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
24 mars 2004 à 16:17
??

.  .  Bon!Si on m'empeche de travailler
\_/  Je ne me debattrai pas!

                
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci seb mais pourrais tu m'explique comment fonctionne pickle()?
0
Merci seb ca marche bien
mais maintenant un autre probleme se pose a moi
comment puis je connecter plusieurs client a un serveur et lorsque que je vais recevoir un message comment savoir par qui il a ete envoyer merci
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 662
25 mars 2004 à 16:30
Pour savoir quel client se connecte, c'est l'objet socket qui te le dira.


Un socket est un couple (adresseIPLocal:portLocal, adresseIPdistante:portDistant).
Un socket identifie de façon unique une communication entre 2 logiciels.

En lisant les propriété du socket, tu pourra savoir de quel client il s'agit.
(variable addr de notre serveur ci-dessus).
Par exemple, ajoute un print addr juste après l'instruction accept() dans le serveur. Tu verra l'adresse et le port du client.


Note que si tu veux traiter beaucoup de clients à la fois, il faudra peut-être penser aux performances: Notre serveur ici est mono-client (il ne traite qu'un client à la fois avant de passer au suivant).
Il faudra sans doute faire du multi-thread ou bien des sockets asynchrones.

Si il peut y avoir différents utilisateurs, il faudra peut-être prévoir un système d'authentification (avec login/password).
0
Je suis en train de faire un crawler en python pour l'instant il fonctionne avec un client et un serveur mais je souhaiterais le faire fonctionner sur plusieur client histoire d'ammeliorer le rendement mon but est lorsque qu'un client trouve un lien il regarde s'il est du meme domaine que celui qu'il fait et alors il le parcourrera apres sinon il l'envoi au serveur qui le redirige vers un client libre ceci permettra donc d'accelerer la chose donc voila pourquoi j'ai besoin de savoir commment ca fonctionne avec plusieur client merci
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
25 mars 2004 à 17:34
Désolé de l'incruste!
Justeun post pour retrouver le message dans mes contributions car la discussions m'interresse.

a+
dje-dje

Il y a 10 types de personne dans le monde,
ceux qui comprennent le binaire et les autres ...
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 662
25 mars 2004 à 18:03
cyril> dans ce cas, je te recommande de jeter un coup d'oeil du côté de pyro:

cela permettra aux clients d'appeler des méthodes directement sur le serveur, de passer des objets complets entre eux, et de communiquer facilement.

pyro s'occupera de toute la partie bas niveau (qui est généralement pénible à coder): gestion réseau, connexion, transfer, reprise en cas d'erreur, sérialisation des objets, etc.
0