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

Python Discussion :

envoi de lignes de commande via un socket


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Septembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Septembre 2016
    Messages : 22
    Points : 27
    Points
    27
    Par défaut envoi de lignes de commande via un socket
    Bonjour,

    Je cherche à faire fonctionner deux scripts ensemble afin de tester une application.
    Un premier script gèrerait le séquencement du test en envoyant successivement les commandes.
    Un second script recevrait les commandes, et après les avoir interpètées, piloterait l'application à tester.

    Le problème que je rencontre, est que l'envoi d'une commande à l'aide de la méthode socket.send fonctionne.
    Si j'envoie deux commandes successives (espacées de 10 secondes dans le temps), mon serveur reçoit une chaine de caractère qui semble concaténer mes deux commandes. Je reçois ainsi "Force Var_Left TRUEForce..."

    Comment puis-je forcer l'envoi des commandes de manières séparées et successives ?

    Merci pour votre aide.

    Le script serveur attend chaque commande:
    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
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        socket.bind(('', 15555))
    except socket.error:
        print("Echec connexion")
        sys.exit()
     
    while (Running==True):
    #while True:
            socket.listen(5)
            client, address = socket.accept()
            print("{} connected".format( address ))
     
            response = client.recv(255)
            if response != "":
                    CommandLine=(response.split(" "))
                    if CommandLine[0]=="Quit":
                        QuitApplication()
                        Running=False
                    if CommandLine[0]=="Force":
                        ForceValue(CommandLine[1], CommandLine[2])
                        CommandLine[:]=[]
                        response=""              
     
     
    print("Close")
    client.close()
    socket.close()
    Le script client envoi les commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.connect((hote, port))
    print "Connection on {}".format(port)
     
    socket.send(u"Force Var_Left TRUE")
    time.sleep(10)
    socket.send(u"Force Var_Right TRUE")
    time.sleep(10)
    socket.send(u"Quit")
     
    print("Close")
    socket.close()

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

    Citation Envoyé par nicolas2333 Voir le message
    Comment puis-je forcer l'envoi des commandes de manières séparées et successives ?
    TCP/IP garantit seulement que les bytes seront reçus dans le même ordre qu'ils ont été transmis. Si vous expédiez 2 x 10 bytes vous pourrez recevoir 5 puis 5, puis 10 ou tous les 20 d'un coup.
    Quand vous dites "commande", vous introduisez une notion de message (quelque chose entre un début et une fin) qui n'est pas de "base".
    Il faut la réaliser vous même en choisissant:
    • de préfixer le "message" avec le nombre d'octets qu'il contient,
    • des messages à taille fixe,
    • un délimiteur de fin (comme '\n' pour fin de ligne).

    Le how-to sur la programmation des sockets est intéressant à lire.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Septembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Septembre 2016
    Messages : 22
    Points : 27
    Points
    27
    Par défaut Envoi de socket.send() successifs
    Bonjour,
    J'ai modifié mon code pour pouvoir gérer des messages. Quelque chose de simple pour le moment, un caractère " " entre chaque élement ce qui me permet de récupérer facilement une liste d'éléments à traiter.

    Par contre, je voulais faire en sorte que le serveur écoute en permanence et réalise les actions au fur et à mesure de la réception des commandes.

    Et là, je constate que dans cette partie de code, seule est reçu par le serveur le premier "send"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    socket.send(u"Force Var_Left TRUE")
    time.sleep(10)
    socket.send(u"Force Var_Right TRUE")
    time.sleep(10)
    socket.send(u"Quit")
    Je constate aussi que le serveur est bien toujours à l'écoute et fonctionnel puisque le déroulement d'un autre script arrête bien le serveur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import socket
     
    hote = "localhost"
    port = 15555
     
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.connect((hote, port))
    print "Connection on {}".format(port)
     
    socket.send(u"Quit ")
     
    print "Close"
    socket.close()
    J'ai donc essayé d'utiliser des commandes close et connect entre chaque utilisation de "socket.send" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    socket.close()
    socket.connect((hote, port))
    Mais le script rencontre alors des problèmes d'utilisation multiple d'un même port.

    Comment puis-je faire pour que les utilisations successives de "socket.send" soient prises en compte ? Est ce qu'il y a une commande pour libérer le port avant réutilisation ? Est-il judicieux de clore la connexion entre chaque envoi ?

    J'ai regardé le how-to, mais j'avoue que ce n'est pas trop simple à comprendre quand on débute sur ces questions d'échanges via le réseau.
    Merci,

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par nicolas2333 Voir le message
    J'ai regardé le how-to, mais j'avoue que ce n'est pas trop simple à comprendre quand on débute sur ces questions d'échanges via le réseau.
    Si le code du serveur est celui que vous avez posté initialement, relisez le tuto. et regardez la structure utilisée autour de listen et accept... vous avez aussi la possibilité de faire des "print" côté serveur pour visualiser ce qui a été reçu et de quel client.

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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Septembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Septembre 2016
    Messages : 22
    Points : 27
    Points
    27
    Par défaut Est-il possible d'utiliser plusieurs commande socket.send() avec une même connexion ?
    Bonjour,

    J'ai repris mes programmes précédents (client et serveur) avec ce que j'ai compris du "How-to" sur la programmation des sockets.

    Avec ce code, le serveur se lance bien et reste actif en attente de commande.
    Le programme client, malheureusement, n'arrive à envoyer qu'une fois. La seconde utilisation de socket.send() dans le même programme client s'exécute sans erreur apparente, mais le message envoyé n'est pas reçu par le serveur.
    Par contre, si je relance le script client une fois que la première exécution est terminée, le premier message envoyé est une nouvelle fois bien reçu (et le second, une fois encore n'est pas reçu). Ce qui prouve que mon serveur est bien toujours à l'écoute.
    Quand je regarde les retour de la commande d'envoi, j'ai bien les retours avec les longueurs des messages dont je demande l'envoi.

    Pourtant, si je ferme la connexion par socket.close() puis rouvre une connexion par socket.connect(("localhost", 15555)) entre chaque envoi, je rencontre une erreur disant que le programme essaie d'établir une connexion déjà en cours.

    Est ce que cela veut dire qu'un seul envoi peut être effectué à chaque connexion ? Ou j'ai raté un truc ?
    Je n'arrive pas à voir ce qui empêcherait ce second envoi dans le même programme de manière systématique. Ni encore moins comment solutionner ce problème ... Des idées de solutions ou de méthodes d'investigation ? A part capturer les échanges de trames TCP/IP, je ne vois plus quoi tenter ?

    Merci,

    Voici les deux programmes :
    serveur :
    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
    import socket
     
    CommandLine = list()
    Running=True
     
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.bind(('', 15555))
    socket.listen(5)
     
    debug = open("debug_t.txt","w") 
     
    while (Running==True):
    #while True:
            #socket.listen(5)
            client, address = socket.accept()
            debug.write("{} connected\n".format( address ))
            #ct = client_thread(client)
            #ct.run()
     
            response = client.recv(255)
            if response != "":
                    debug.write("response\n")
                    debug.write(response)
                    CommandLine=(response.split(" "))
                    debug.write("\nCommandLine\n")
                    print("\n",CommandLine,"\n")
                    for elem in CommandLine:
                        debug.write("\nelem\n")
                        debug.write(elem)
                        if elem=="Quit":
                            debug.write("\ncommand Quit\n")
                            Running=False
                        if elem=="Force":
                            indice=CommandLine.index(elem)
                            debug.write("\ncommand Force\n")
                            print(CommandLine[indice:indice+3])
                        debug.write("\n---------------\n")           
    debug.close()
    print("Close")
    client.close()
    socket.close()
    client :
    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
    import time
    import socket
     
    hote = "localhost"
    port = 15555
     
    class mysocket:
     
        def __init__(self, sock=None):
            if sock is None:
                self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            else:
                self.sock = sock
     
        def connect(self, host, port):
            self.sock.connect((host, port))
            self.sock.setblocking(0)
     
        def close(self):
            self.sock.close()
     
        def mysend(self, msg):
            totalsent = 0
            sent = self.sock.send(msg)
            print(sent)
            if sent == 0:
                raise RuntimeError("socket connection broken")       
     
     
    if __name__== '__main__':
     
        socket=mysocket()
        socket.connect(hote, port)
     
        print("\n--------------------------\n")
        print(i)
        cmd ="Force Var_Right TRUE "
        socket.mysend(cmd)
        print("\nsending 1 done\n")
        time.sleep(10)        
        cmd ="Force Var_Left FALSE "
        socket.mysend(cmd)
        time.sleep(10)
        print("\nQuit\n")
        print("\n--------------------------\n")    
        cmd ="Quit "     
        socket.mysend(cmd)          
        socket.close()

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    ah là là... quand un truc ne fonctionne pas comme vous l'espériez, c'est que vous n'avez pas tout compris.
    Et pour comprendre, il faut ouvrir le manuel et y (re)lire ce que font listen, accept,...

    Dans votre cas, relisez ce que çà raconte pour accept: çà attend une nouvelle requête de connexion client.
    Donc quand vous écrivez une boucle comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (Running==True):
    #while True:
            #socket.listen(5)
            client, address = socket.accept()
            response = client.recv(255)
            if response != "":
                 ...
    çà attend une requête de connexion, puis çà lit et traite un message et on recommence: çà attend la requête de connexion suivante (et tant pis pour le client précédent...).

    où est le problème? ben vous pensez que... alors que çà ne le fait pas comme çà. Pourtant, la documentation du module socket donne tout en bas quelques exemples utiles qui illustrent bien comment utiliser tout çà....

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/05/2009, 15h09
  2. Windows : télécharger en ligne de commande via http
    Par kafifi dans le forum Internet
    Réponses: 6
    Dernier message: 10/03/2007, 17h39
  3. [Comm] envoi des commandes via interface RS232
    Par bob75018 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 16/01/2006, 17h22
  4. Réponses: 3
    Dernier message: 16/12/2005, 15h30
  5. Envoie de mail en ligne de commande
    Par narmataru dans le forum Réseau
    Réponses: 8
    Dernier message: 29/04/2004, 17h38

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