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 :

Chat client-serveur python


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Chat client-serveur python
    Bonjour à tous, voilà j'ai réussi à faire mon projet, c'est-à-dire un chat en python, celui marche très bien, plusieurs personnes peuvent se connecter....

    Mais désormais je dois suivre un protocole qui est assez difficile, je commence par un point important :
    Quand un client se connecte au serveur, il doit envoyer CHAT_SET_NICKNAME(identifiant)

    Ma question est la suivante : comment puis-je dire au serveur de sélectionner seulement la partie qui est dans la parenthèse et comment enregistrer ce num d'utilisateur, sachant que le client entre son propore nom d'utilisateur ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Points : 129
    Points
    129
    Par défaut
    Bonjour

    La méthode la plus pertinente d'extraction du "identifiant" dépend de quelques points non précisé : quels sont les caractères autorisés dans l'identifiant ? Est-ce que les espaces sont autorisés ? Est-ce que les parenthèses sont autorisés ?

    Dans tous les cas, un méthode simple, mais moyennement robuste consiste à utiliser la fonction split() en changeant le séparateur, au lieu d'utiliser l'argument 'espace' par défaut, utiliser les parenthèses :
    essayer:
    "CHAT_SET_NICKNAME(identifiant)".split("()")


    Cordialement
    Emmanuel

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour, et merci de m'avoir répondu.

    L'utilisateur entre un nom, une chaîne de caractère, on dira qu'avec des lettres pour commencer.

    J'ai essayé votre split, ça ne marchais pas, je vous montre mon code, pour voir comment on pourrait le mettre.

    class ThreadClient(threading.Thread):
    '''derivation d'un objet thread pour gerer la connexion avec un client'''
    def __init__(self, conn):
    threading.Thread.__init__(self)
    self.connexion = conn

    def run(self):
    # Dialogue avec le client :
    nom = self.getName() # Chaque thread possede un nom
    while 1:
    msgClient = self.connexion.recv(1024)
    if msgClient.upper() == "FIN" or msgClient =="":
    break
    message = "%s> %s" % (nom, msgClient)
    print message
    # Faire suivre le message a tous les autres clients :
    for cle in conn_client:
    if cle != nom: # ne pas le renvoyer a l'emetteur
    conn_client[cle].send(message)

    # Fermeture de la connexion :
    self.connexion.close() # couper la connexion cote serveur
    del conn_client[nom] # supprimer son entree dans le dictionnaire
    print "Client %s deconnecte." % nom
    # Le thread se termine ici
    On peut apercevoir, que si le client écrit FIN ou rien, le client se déconnecte, je pensait mettre un elif, puis dire si le client envoi "CHAT_SET_NICKNAME(identifient)", on enregistre l'identifiant, mais j'ai essayé la technique de slitp, ça n'a pas marché.

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

    Avec "m = self.connexion.recv(1024)", vous récupérez dans m jusqu'à 1024 bytes accumulés dans la pile IP du récepteur.
    Dit autrement, si l'émetteur expédie "toto", puis "tutu", la lecture pourra retourner "tototutu", "toto", "tototu". C'est pour cela qu'on appelle les sockets TCP/IP "stream".

    Tant que le serveur ré-expédie tout ce qu'il reçoit à l'ensemble des clients connectés - 1, le "stream" est sans importance.
    Par contre dès qu'on veut insérer dans le "stream" des "commandes" i.e. le découper en unités logiques qui permettront de discerner "toto" puis "tutu" on ne peut plus ignorer ce qu'est "stream".
    Depuis des décennies, les protocoles TCP/IP ont choisi de découper ce "stream" en lignes de texte terminées par <CRLF> ('\r\n').
    Et ces lignes de textes seront plutôt de la forme <COMMANDE> P1 P2 ... PN<CRLF>. Dans le cas de votre "chat", vous pourrez avoir:
    • ECHO texte<CRLF>: que le serveur "broadcaste" à l'ensemble des clients -1,
    • FIN<CRLF>
    • SET_NICKNAME identifiant<CRLF>

    Comme le format de ces "commandes" est semblable, il est facile d'écrire un dispatcher qui déclenche l'action associée à la commande en appelant une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dispatch_table = dict(
        ECHO = do_echo,
        FIN = do_fin,
        SET_NICKNAME = do_set_nickname,
    )
    Tout cela peut sembler "compliqué" mais il existe un module asynchat qui fait une grande partie du boulot et pleins d'exemples d'utilisation sur Google.

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

Discussions similaires

  1. [RMI] Chat client-serveur
    Par Slim_X dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 13/05/2014, 13h45
  2. chat client serveur android
    Par felix01 dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 08/01/2014, 23h45
  3. Chat client-serveur : conseils sur le langage à utiliser
    Par Invité dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 28/10/2012, 14h30
  4. Création d'un chat (client serveur)
    Par sperca dans le forum Réseau
    Réponses: 2
    Dernier message: 09/09/2009, 17h29
  5. Probleme sur chat client serveur
    Par sobshak dans le forum Réseau
    Réponses: 6
    Dernier message: 03/12/2008, 16h43

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