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 :

Problème de connexion avec socketserver


Sujet :

Réseau/Web Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut Problème de connexion avec socketserver
    Bonjour,

    Je suis en train de tester socketserver. J'ai essayé de faire communiquer un windows 7 python 3 (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
    import socket
    import sys
    import time
     
    HOST, PORT = "192.168.23.1", 45600
    data = " ".join(sys.argv[1:])
     
    # Create a socket (SOCK_STREAM means a TCP socket)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    # Connect to server and send data
    print(data+"\n")
    sock.connect((HOST, PORT))
    try :
        sock.sendall(bytes(data + "\n", "utf-8"))
        sock.sendall(bytes(data[0:-1] + "\n", "utf-8"))
        sock.sendall(bytes(data[0:-2] + "\n", "utf-8"))
    finally:
        # Receive data from the server and shut down
        received = str(sock.recv(1024), "utf-8")
        sock.close()
     
    print("Sent:     {}".format(data))
    print("Received: {}".format(received))
    Avec un "serveur" sous linux :
    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
    #!/usr/bin/python2.7
    # -*- coding: utf-8 -*-
    import socket
    import threading
    import SocketServer
     
    class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
     
        def handle(self):
            data = self.request.recv(1024)
            cur_thread = threading.current_thread()
            #print("receive : "+data[0:-1])
            self.server.tmp.insert(0,data[0:-1])
            response = "{}: {}".format(cur_thread.name, data)
            self.request.sendall(response)
     
    class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
        tmp = []
     
     
    def client(ip, port, message):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((ip, port))
        try:
            sock.sendall(message)
            response = sock.recv(1024)
            print "Received: {}".format(response)
        finally:
            sock.close()
    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
    !/usr/bin/python2.7
    # -*- coding: utf-8 -*-
     
    import TCPSocket2
    import time
    import signal
     
    def sortie(signum,frame):
        print "server stop running"
        server.shutdown()
        exit()
     
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "192.168.23.1", 45600
    signal.signal(signal.SIGINT,sortie)
    server = TCPSocket2.ThreadedTCPServer((HOST, PORT), TCPSocket2.ThreadedTCPRequestHandler)
    ip, port = server.server_address
    print(server.timeout)
    server.timeout=500
    print(server.timeout)
    # Start a thread with the server -- that thread will then start one
    # more thread for each request
    server_thread = TCPSocket2.threading.Thread(target=server.serve_forever)
    # Exit the server thread when the main thread terminates
    #server_thread.daemon = True
    print server_thread.daemon
    server_thread.start()
    print "Server loop running in thread:", server_thread.name
     
    while True:
      #q  print len(server.tmp)
        while len(server.tmp)!=0:
            print server.tmp.pop()
        time.sleep(0.1)
     
    #server.shutdown()
    Quand je lance le client sous window celui-ci n'envoie que le premier sendall mais pas les deux commandes sendall suivantes environ 9 fois sur 10.

    Si j'essaie de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sock.sendall(bytes(data + "\n", "utf-8"))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print (sock.sendall(bytes(data + "\n", "utf-8")))
    J'ai une erreur 10053 (abandon de connexion par l'ordianteur hôte), idem si je fais des time.sleep(1) entre chaque commande.

    Si j'essaie le code du client sous linux j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BrokenPipeError: [Errno 32] Broken pipe
    dès le deuxième sendall.

    J'ai essayé d'augmenter le timeout (jusqu'à 500) mais rien n'y fait. Il doit avoir un paramétre du serveur à positionner.

    Merci d'avance pour votre aide.
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  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,

    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    received = str(sock.recv(1024), "utf-8")
    sock.recv attendra d'avoir reçu 1024 (qui ne sont pas expédies) pour revenir.
    Essayez d’echanger des trames de longueur fixe pour voir.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    Bonjour et merci pour votre réponse,

    Entre-temps j'avais trouver une explication...

    SocketServer déclenche la méthode handler dès qu'une requête se présente. La méthode telle qu'elle était écrite lit le socket :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data = self.request.recv(1024)
    une fois puis ferme la connexion, ce qui a pour effet de la fermer côté client. Lors de l'envoie de la deuxième requête la connexion étant fermée (broken pipe) une erreur est renvoyée au client.
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  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
    Désolé!
    Je pensais que cette erreur n'arriverait qu’après.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    socket.recv(bufsize[, flags])
    Receive data from the socket. The return value is a string representing the data received. The maximum amount of data to be received at once is specified by bufsize.
    http://docs.python.org/2/library/socket.html
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  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
    oops, je fais trop de trucs a la fois.
    Le soucis est longueur fixe ou CRLF ou un "count" en en tete.

    Exemple:
    on expédie deux lignes de 10C.
    Si on lit jusqu’à (1024), le nombre de caractères retournes pourra être 10 ou 20 - c'est un stream - pas des "messages": les bytes seront reçus dans l'autre mais recv ne les remonte pas suivant les .send.

    Ca ne se voit pas trop lorsqu'on est en start/stop - l’émetteur attend qqc. avant d’expédier le buffer suivant. La documentation Python raconte ca dans using a socket

    Ca me fait reviser, c'est bien.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probléme de connexion avec ATT via une freebox
    Par ybertrand dans le forum Hardware
    Réponses: 3
    Dernier message: 17/10/2005, 16h06
  2. [connexion Mysql] problème de connexion avec l'odbc
    Par DarkAngelus dans le forum Administration
    Réponses: 2
    Dernier message: 13/10/2005, 11h24
  3. Réponses: 6
    Dernier message: 20/09/2005, 22h28
  4. [MSDE2000] Problème de connexion avec DbaMgr2k et SQL WDA
    Par Coplan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/06/2005, 15h37
  5. problème de connexion avec une base firebird
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/05/2005, 11h40

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