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 :

socket s.send() unicode


Sujet :

Réseau/Web Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Points : 66
    Points
    66
    Par défaut socket s.send() unicode
    Bonjour à tous,

    J'ai récemment commencer à créer un serveur, jusque la tout va bien enfin presque

    Mon client est configuré à etre en attente de commande.
    Le serveur à une commande, ca va aussi.


    Dans mon cas, quand le client envoie ls, le serveur détecte la chaine et exécute donc un

    J'ai vérifié que la commande s'exécute et je vois bien mes dossiers.

    Maintenant ce que je souhaite faire c'est que ce résultat de la liste des dossiers affichés apparaissent sur mon client.

    Je n'ai pas encore trouvé de solution, j'ai essayé un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    obFichier.write(os.system("ls"))
    pour contenir le résultat du ls mais sans succès !!!

    Donc le stockage du rendue de la commande est mon premier problème, et l envoie des informations est mon second problème.


    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
     
    import socket
    import os
     
    HOST = 'localhost'    # Symbolic name meaning the local host
    PORT = 25000           # Arbitrary non-privileged port
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    print "SERVEUR OUVERT"
    print 'connecte avec', addr
     
    obFichier = open('buffer','w')
     
    while 1:
            data = conn.recv(1024)
    	if data=="ls":			
    		obFichier.write(os.system("ls"))
    	if data=="rep":			
    		rep= os.getcwd()
    		print rep
    	if not data: break
            print 'le client envoi', repr(data)
            conn.send(data)
    print "Le client se deconnecte, fermeture du serveur"
    obFichier.close()
    conn.close(

    Merci d'avance

  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
    ben il faut récupérer la sortie de os.system('ls') dans un string genre 'data' puis
    l'expédier en réponse au client.
    Pour faire la moitié du boulot, commencez par tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while 1:
            data = conn.recv(1024)
    	if data=="ls":			
    		# obFichier.write(os.system("ls"))
                    results = 'resultat de ls'
    	if data=="rep":			
    		# rep= os.getcwd()
    		# print rep
                    results = 'resultat de cwd'
    	if not data: break
            print 'le client envoi', repr(data)
            print 'je lui retourne: ', results
            conn.send(results)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Il me reste une seul chose a comprendre :

    Ma commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    results = os.system("ls")
    Me renvoie la chose suivante :

    conn.send(reponse)
    TypeError: send() argument 1 must be string or buffer, not int

  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
    Citation Envoyé par jack_x4 Voir le message
    Il me reste une seul chose a comprendre :

    Ma commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    results = os.system("ls")
    Me renvoie la chose suivante :
    1 . Faites fonctionner le code que je vous ai donné.
    2 . Réalisez la commande 'rep' pour trimbaler le cwd
    3 . oubliez os.system et passez par subprocess:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> import subprocess as sp
    >>> p = sp.Popen('ls', stdout=sp.PIPE)
    >>> results = p.communicate()[0]
    >>> print results
    MANIFEST.in
    PasteDeploy-1.3.3-py2.6.egg
    PasteScript-1.7.3-py2.6.egg
    README.txt
    build
    data
    ...
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Effectivement la solution est la.

    Je confirme que la réception de la commande est interprété, et le résultat est envoyé au client.


    Voici ce qui se passe maintenant au niveau des caractères:
    Dans ces deux exemples vous pouvez voir ce qui sort et rentre :

    CLIENT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    entrez votre commande: a
    votre message  a
    Serveur:  'commande inconnue'
    entrez votre commande: é
    votre message  é
    Serveur:  'commande inconnue'
    entrez votre commande:
    SERVEUR:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SERVEUR OUVERT
    connecte avec ('127.0.0.1', 53843)
    le client envoi : 'a'
    je lui retourne:  commande inconnue
    le client envoi : '\xc3\xa9'
    je lui retourne:  commande inconnue
    le retour chariot et reçu chez le client comme un \n !!!

  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
    Ah ben, maintenant il faut commencer à réfléchir.

    Si vous lisez ce qu'a tapé l'utilisateur avec raw_input vous allez récupérer une chaine de caractères encodée en fonction du "locale" de la machine avec des retours charriot etc...
    Donc il va falloir nettoyer un peu cela.

    De l'autre côté le serveur répondra a certaines commandes qui auront ou pas des paramètres. Inutile que les commandes soient écrites avec autre chose que de l'ASCII et dangereux d'expédier les caractères tapés par l'utilisateur directement:
    1 - Le client doit savoir quelle est la commande expédiée pour s'assurer que l'ensemble des paramètres attendus sont là ou fournir des défauts... Et pour traiter les réponses du serveur en fonction de.
    2 - Le serveur ne traite les commandes reçues qu'a partir du moment ou elles respectent un certain format.
    Allez jeter un oeil sur les RFC de protocoles réseaux tels que SMTP ou FTP pour voir comment sont résolus ces problèmes.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Je pense que le problème vient de s.send(texte) car j'ai tenté de faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    texte = unicode(texte, 'utf-8')
    Et le client me renvoie une erreur quand j ai envoyé é a partie du client :

    line 19, in <module> s.send(texte) UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128)

    Si je tente de decoder au niveau serveur j'ai une erreur sur conn.send(reponse)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Finalement en enlevant repr() et le j'ai enlevé les erreurs !!!!

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/07/2015, 18h02
  2. [socket] Pb send() et recv()
    Par Tymk dans le forum C++
    Réponses: 6
    Dernier message: 03/06/2008, 18h44
  3. Socket et send();
    Par deviante dans le forum C++
    Réponses: 2
    Dernier message: 13/01/2006, 20h32
  4. [SOCKET] TCP : select devant send();
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 02/03/2004, 18h10
  5. [SOCKET C] deux send() pour un recv()
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 01/12/2003, 19h13

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