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 :

SocketServer : exécution d'une fonction avant l'envoi de la réponse.


Sujet :

Réseau/Web Python

  1. #1
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut SocketServer : exécution d'une fonction avant l'envoi de la réponse.
    Bonjour,

    Je suis en train de faire un serveur pour réceptionner des messages en mode socket.
    Le serveur fonctionne bien mais j'ai un problème pour exécuter un fonction de traitement sur le message avant de retourner la réponse.
    Dans le code suivant, comment puis je faire pour être sûr que j'ai reçu le message entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class IDTMVT(SocketServer.BaseRequestHandler):
        def handle(self):
            message=""
            while True:
                donneesRecues = self.request.recv(8192)
                message+=donneesRecues
                if not donneesRecues :
                    break
                self.request.sendall(reverseMessage(message))
            self.request.close()
    j'aimerai exécuter le self.request.sendall(...) à l'extérieur du while, mais ca bloque. Mon soft d'émission de messages attend le retour en vain.
    Si par contre je laisse self.request.sendall(...) dans le while, j'obtiens bien un retour dans mon soft d'émission de messages.

    En l'état j'ai bien le retour, mais je peux avoir une succession de retour si par exemple le message dépasse les 8192 octets alors que je souhaite n'en faire qu'un et un seul, une fois le message entièrement reçu et traité.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 239
    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 239
    Points : 36 692
    Points
    36 692
    Par défaut
    Salut,

    Citation Envoyé par airod Voir le message
    En l'état j'ai bien le retour, mais je peux avoir une succession de retour si par exemple le message dépasse les 8192 octets alors que je souhaite n'en faire qu'un et un seul, une fois le message entièrement reçu et traité.
    Ca serait bien d'aller voir du côté de la rubrique réseau ce qu'est une "socket" en mode STREAM. Mais intuitivement, si vous voulez transformer un flot de bytes en messages, il faut soit:
    • ajouter un délimiteur de fin comme <CRLF>.<CRLF> du protocole SMTP,
    • échanger des buffers de longueur fixe (1 message = 512 octets avec du padding),
    • indiquer la longueur du message dans les premiers bytes,
    • ...


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

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Juste une idée.

    En utilisant StreamRequestHandler, le serveur attend une ligne complète terminée par une fin de ligne (en appelant recv autant de fois qu'il faut)

    Extrait de la doc:

    The difference is that the readline() call in the second handler will call recv() multiple times until it encounters a newline character, while the single recv() call in the first handler will just return what has been sent from the client in one sendall() call.
    La doc n'est pas terrible: elle arrive à donner des exemples qui contiennent des méthodes non documentées (request)...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/09/2013, 17h31
  2. Exécuter une fonction avant une autre
    Par islyoung2 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 21/07/2010, 16h51
  3. Exécution d'une fonction avant validation formulaire
    Par celinecassiope dans le forum Langage
    Réponses: 2
    Dernier message: 07/06/2009, 19h45
  4. Pause dans l'exécution d'une fonction
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/06/2005, 08h48
  5. Exécution d'une fonction...
    Par mickeliette dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/11/2004, 17h59

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