IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Thread & Serveur echo


Sujet :

Réseau/Web Python

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Points : 115
    Points
    115
    Par défaut Thread & Serveur echo
    Bonjour bonjour

    Je suis en train d'essayer de coder un petit programme qui envois des message en udp sur le reseau local.
    Un espece de messenger en faite...

    Mais j'ai un petit soucis, que je ne parvient pas à résoudre...
    Au debut je lance l'écoute sur un port, mais seulement l'instruction est bloquante. Et ne rends pas la main... donc les ligne suivante l'appel ne s'exécute pas...

    Main.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from Lib_WifiMessenger import *
    from multiprocessing import Process
     
    connec = Connection()
    saisie = 'Se connecte : '
    p_recv = Process(connec.Start_Recevoir())
    p_recv.start()
    while saisie != '#exit':
        connec.Envoyer(saisie)
        saisie = raw_input()
    Lib_WifiMessenger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import socket
    import sys
    class Connection(object):
        def __init__(self):
            self.port = 20462
            self.thread_continue = False
            self.sock_in = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            self.sock_in.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.sock_in.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
     
            self.sock_out = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            self.sock_out.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
     
        def Envoyer(self, message):
            self.sock_out.connect(('<broadcast>',self.port))
            self.sock_out.send(message)
     
        def Start_Recevoir(self):
            print ("Thread d\'ecoute lance sur : "+str(socket.gethostbyname(socket.gethostname())))
            self.sock_in.bind((socket.gethostbyname(socket.gethostname()), self.port))
            while 1:
                message, addr = self.sock_in.recvfrom(4096)
                sys.stdout.write(message)

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    Ben connec.Start_Recevoir() demande l'évaluation de la fonction alors que Process préférerait le point d'entrée du process/thread à démarrer, i.e
    connec.Start_Recevoir sans les '()'

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    connec = Connection()
    saisie = 'Se connecte : '
    p_recv = Process(target=connec.Start_Recevoir, args=())
    p_recv.start()
    while saisie != '#exit':
        connec.Envoyer(saisie)
        saisie = raw_input()

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Points : 115
    Points
    115
    Par défaut
    Bonjour,
    Merci pour ta réponse, mais il est impossible de lancer l'application avec ta modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Traceback (most recent call last):
      File "C:\main.py", line 7, in <module>
        p_recv.start()
      File "C:\Python26\lib\multiprocessing\process.py", line 104, in start
        self._popen = Popen(self)
      File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__
        dump(process_obj, to_child, HIGHEST_PROTOCOL)
      File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump
        ForkingPickler(file, protocol).dump(obj)
      File "C:\Python26\lib\pickle.py", line 224, in dump
        self.save(obj)
      File "C:\Python26\lib\pickle.py", line 331, in save
        self.save_reduce(obj=obj, *rv)
      File "C:\Python26\lib\pickle.py", line 419, in save_reduce
        save(state)
      File "C:\Python26\lib\pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "C:\Python26\lib\pickle.py", line 649, in save_dict
        self._batch_setitems(obj.iteritems())
      File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
        save(v)
      File "C:\Python26\lib\pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "C:\Python26\lib\multiprocessing\forking.py", line 40, in dispatcher
        self.save_reduce(obj=obj, *rv)
      File "C:\Python26\lib\pickle.py", line 401, in save_reduce
        save(args)
      File "C:\Python26\lib\pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "C:\Python26\lib\pickle.py", line 548, in save_tuple
        save(element)
      File "C:\Python26\lib\pickle.py", line 331, in save
        self.save_reduce(obj=obj, *rv)
      File "C:\Python26\lib\pickle.py", line 419, in save_reduce
        save(state)
      File "C:\Python26\lib\pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "C:\Python26\lib\pickle.py", line 649, in save_dict
        self._batch_setitems(obj.iteritems())
      File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
        save(v)
      File "C:\Python26\lib\pickle.py", line 331, in save
        self.save_reduce(obj=obj, *rv)
      File "C:\Python26\lib\pickle.py", line 419, in save_reduce
        save(state)
      File "C:\Python26\lib\pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "C:\Python26\lib\pickle.py", line 548, in save_tuple
        save(element)
      File "C:\Python26\lib\pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "C:\Python26\lib\pickle.py", line 649, in save_dict
        self._batch_setitems(obj.iteritems())
      File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
        save(v)
      File "C:\Python26\lib\pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "C:\Python26\lib\pickle.py", line 748, in save_global
        (obj, module, name))
    PicklingError: Can't pickle <built-in method recvfrom_into of _socket.socket object at 0x01670A48>: it's not found as __main__.recvfrom_into

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si vous voulez créer un process dont le point d'entrée est la méthode "truc", vous n'avez pas d'autre choix que de passer l'adresse de "truc" avec ses éventuels arguments "a part"... Aucune chance pour que l'évaluation de "truc" puisse être faite dans le contexte cible sinon.

    Pour vous en convaincre, essayez avec des exemples "simples".

    L'erreur dit que le "truc" que vous donnez à Process ne plait pas à "pickle" et cela dépend plus du contenu/nature du "Connection" sorti de "Lib_WifiMessenger"...

    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Points : 115
    Points
    115
    Par défaut
    Hum hum...

    Mais comment savoir ce qui coince pour pickle ?
    Sinon il n'y a pas moyen alors de faire un thread à la place d'un process?
    Mais que celui si ne bloque pas le déroulement de mon programme ensuite..

    Merci

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par dogua Voir le message
    Hum hum...

    Mais comment savoir ce qui coince pour pickle ?
    Il faut voir ce qu'il y a dans Lib_Wifi...

    Sinon il n'y a pas moyen alors de faire un thread à la place d'un process?
    C'est la même API, voir le FAQ


    Mais que celui si ne bloque pas le déroulement de mon programme ensuite..
    i[/QUOTE]
    Lib_Wifi a sans doute de bonnes raisons de ne pas être 'pickable' mais peut être aussi d'autres restrictions qu'il serait bon de connaitre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Points : 115
    Points
    115
    Par défaut
    Lib_WifiMessenger est affiché dans mon premier post

    J'ai regarder un peu, et en faite, il ne veut tous simplement pas de "socket"

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Désolé mais en prenant ce que vous avez fourni et la correction que je vous ai proposé, chez moi la chose se lance sans les messages d'erreurs "Pickle" que vous mentionnez.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Thread sur serveur
    Par hugoclo dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 13/05/2015, 23h25
  2. [Struts]Serveur web + threads
    Par Allen2k2 dans le forum Struts 1
    Réponses: 6
    Dernier message: 24/06/2005, 13h40
  3. Réponses: 7
    Dernier message: 19/10/2004, 19h09
  4. Réponses: 16
    Dernier message: 30/01/2004, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo