Reseau en python

J'aimerais savoir comment est il possible d'envoyer autre chose qu'une chaine de caractere genre un tableau?

10 réponses

  1. Modérateur
    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/

    :-)
    1. Modérateur
      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)
      1. Modérateur
        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.
        1. Contributeur
          ??

          .  .  Bon!Si on m'empeche de travailler
          \_/  Je ne me debattrai pas!
          1. 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
            1. Modérateur
              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).
              1. 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
                1. Modérateur
                  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 ...
                  1. Modérateur
                    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.