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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    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.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 768
    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 768
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    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.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 768
    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 768
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    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

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 768
    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 768
    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