Partage
  • Partager sur Facebook
  • Partager sur Twitter

serveur/client aide

Sujet résolu
    13 octobre 2010 à 20:53:26

    Bonjour,

    en ce moment je me penche beaucoup sur le python et je m'intéressai a faire un serveur/client.

    J'ai trouvez pas mal de chose en cherchant sur le forum, j'arrive a maintenir la connexion mais le soucis est que quand le client veut envoyer sont texte sa ne fonctionne pas j'ai une grosse erreur (coter client):

    Connexion etablie
    S> Bienvenue
    C> test
    
    Traceback (most recent call last):
      File "C:\Users\steven\Desktop\bot\client2.py", line 17, in <module>
        s.send(input("C> ").encode("utf-8"))
      File "<string>", line 1, in <module>
    NameError: name 'test' is not defined
    >>>
    

    et mon coter serveur bien-sur ne reçois pas "test" :

    Server installe
    En attente de connexion...
    New client : 127.0.0.1 sur le port 53129 vient de se connecter
    



    j'aimerai que mon serveur reste tous le temps connecter et puisse recevoir plusieurs connexion.

    voici mon script serveur :

    # -*- coding: utf-8 -*-
    import sys, socket
    port =5555
    s =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.bind(('', port)) # tuple waiting
    except s.error:
        print("impossible de lier le socket à ce port")
        sys.exit()
    print("Server installe")
    s.listen(1) # prépare a recevoir 1 personne
    print("En attente de connexion...")
    news, addr =s.accept() # interruption
    print("New client : " + addr[0] +" sur le port " +str(addr[1]) +" vient de se connecter")
    news.send("Bienvenue".encode("utf-8"))
    msgC =news.recv(1024).decode("utf-8")
    while 1:
        if msgC.upper() =="END":
            break
        print("C> " +msgC)
        news.send(input("S> ").encode("utf-8"))
        msgC =news.recv(1024).decode("utf-8")
    print("Fin de la connexion avec ce client")
    news.send("END".encode("utf-8"))
    news.close()
    


    et coter client :
    # -*- coding: utf-8 -*-
    import socket, sys
    ip, port ="localhost", 5555
    s =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((ip, port)) # tuple attendu
    except s.error:
        print("connexion impossible au server")
        raise SystemExit
    print("Connexion etablie")
    msgS =s.recv(1024).decode("utf-8")
    while 1:
        if msgS.upper() =="END":
            break
        print("S> " +msgS)
        s.send(input("C> ").encode("utf-8"))
        msgS =s.recv(1024).decode("utf-8")
    print("FIN connexion")
    s.send("end".encode("utf-8"))
    s.close()
    


    Je connais pas trop les sockets. Si vous avez de la doc fr sa m'intéresse, pour création de serveur client, utilisation du module socket.

    Merci d'avances ;)
    • Partager sur Facebook
    • Partager sur Twitter
      14 octobre 2010 à 2:06:59

      Si tu programmes en Python 2.x, remplace tes input par des raw_input. input est dans ces versions l'équivalent de eval(raw_input()) : il ne récupère par la chaîne de caractères entrée, mais l'interprète et récupère son résultat. Comme test n'est pas défini, ça fait donc planter le système.
      • Partager sur Facebook
      • Partager sur Twitter
        14 octobre 2010 à 8:41:18

        Bonjour,

        tu n'as pas indiqué l'adresse IP du serveur dans le code "coté Serveur" et encore moins du "côté client".

        Sous Python 3.x dans mon code: Le client et le serveur sont sur la même machine.

        Côté Client:
        import socket, sys
        
        HOST = socket.gethostname()
        PORT = 50000
        
        mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        
         # 2) envoi d'une requête de connexion au serveur :
        try:
            mySocket.connect((HOST, PORT))
        except socket.error:
            print("La connexion a échoué.")
            sys.exit()
            
        print("Connexion établie avec le serveur.")
        
         # 3) Dialogue avec le serveur :
        msgServeur = mySocket.recv(1024).decode("Utf8")
        
        while 1:
            if msgServeur.upper() == "FIN" or msgServeur =="":
                break
            print("Serveur: ->", msgServeur)
            msgClient = input("Client: " + HOST + " ->")
            mySocket.send(msgClient.encode("Utf8"))
            msgServeur = mySocket.recv(1024).decode("utf8")
        
         # 4) Fermeture de la connexion :
        print("Connexion interrompue.")
        mySocket.close()
        



        Côté Serveurt:
        # Définition d'un serveur réseau rudimentaire
        # Ce serveur attend la connexion d'un client
        
        import socket, sys
        
        HOST = socket.gethostname()
        PORT = 50000
        counter = 0 # compteur de connexions actives
        
         # 1) création du socket :
        mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        
         # 2) liaison du socket à une adresse précise :
        try:
            mySocket.bind((HOST, PORT))
        
        except socket.error:
            print("La liaison du socket à l'adresse choisie a échoué.")
            sys.exit
        
        while 1:
         # 3) Attente de la requête de connexion d'un client :
            print("Serveur prêt, en attente de requêtes ...")
            mySocket.listen(3)
        
         # 4) Etablissement de la connexion :
            connexion, adresse = mySocket.accept()
            counter +=1
            print("Client connecté, adresse IP {0}, port {1}".format(adresse[0], adresse[1]))
        
         # 5) Dialogue avec le client :
            msgServeur = "Vous êtes connecté au serveur Realmagma. Envoyez vos messages."
            connexion.send(msgServeur.encode("Utf8"))
            msgClient = connexion.recv(1024).decode("Utf8")
            while 1:
                print("Client" + str(counter) + ">", msgClient)
                if msgClient.upper() == "FIN" or msgClient == "":
                    break
                msgServeur = input("Serveur: ->")
                connexion.send(msgServeur.encode("Utf8"))
                msgClient = connexion.recv(1024).decode("Utf8")
        
         # 6) Fermeture de la connexion :
            connexion.send("fin".encode("Utf8"))
            print("Connexion interrompue.")
            connexion.close()
        
            ch = input("<R>ecommencer <T>erminer ? ")
            if ch.upper() =='T':
                break
        

        • Partager sur Facebook
        • Partager sur Twitter
          14 octobre 2010 à 15:19:43

          merci c'était bien le problème des input.

          j'en est profiter pour passer sous python 3

          mon script serveur/client fonctionne je peu parler.

          maintenant j'aimerai creer (entre guillemet) des commandes entre mon serveur et mon client et je n'arrive pas a reprendre l'exemple de end
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            14 octobre 2010 à 15:28:44

            Citation

            maintenant j'aimerai creer (entre guillemet) des commandes entre mon serveur et mon client et je n'arrive pas a reprendre l'exemple de end



            du genre?
            • Partager sur Facebook
            • Partager sur Twitter
              14 octobre 2010 à 16:08:49

              End est un cas particulier : son but est de terminer la connexion, on sort donc de la boucle. Prenons un autre exemple, comme "time" : quand tu envoies time, ton serveur doit te répondre l'heure et la date (qu'on peut récupérer grâce à la fonction ctime du module time).
              Pour ça, il suffit de créer un autre if dans la boucle : si le message reçu est "time", on renvoie time.ctime() (en ayant pris soin de faire import time au début).

              Après, pour des commandes qui admettent des arguments, il faut pouvoir récupérer ces arguments. Par exemple, si la commande "dire mot1 mot2 ..." a pour objectif de faire dire au serveur tous les mots qui suivent, on pourrait écrire quelque chose comme :
              if message_recu.startswith("dire"):
                  liste_de_mots_a_dire = message_recu.split()[1:] #pour récupérer tous les éléments sauf le premier
                  for mot in liste_de_mots_a_dire:
                      envoyer(mot)
              

              Après, il faudrait réfléchir à une meilleure façon de stocker les commandes, par exemple un dictionnaire avec comme clé le nom de la commande et comme valeur une fonction à exécuter avec la liste des arguments qui suit. On évite un if qui est lourd, qui rend le code moins lisible, et qui ne permet pas de modifier, supprimer ou rajouter des commandes de façon simple (on peut même, avec un dictionnaire, imaginer une commande qui crée une commande !).

              Pour vérifier qu'on a rentré une commande ou non, idem, startswith n'est pas une bonne solution dès qu'on commence à avoir quelques possibilités. On peut par exemple, à chaque message reçu, faire un split pour récupérer tous les mots (dans ce cas on appelle mot en ensemble de lettres séparées par un ou plusieurs espaces), vérifier que le premier mot est ou non une commande, et si oui, appeler la fonction correspondante avec la suite des mots comme arguments.

              Si tu as pour objectif de faire un système un peu évolué, tu as intérêt à bien préciser les spécifications de ton protocole, c'est-à-dire la façon dont le client et le serveur communiquent, et comment interpréter les messages. Par exemple, tu peux décider qu'on considèrera comme une commande toute phrase qui commence par le caractère "/" (un peu comme sur irc), pour éviter que quelqu'un lance une commande alors qu'il voulait seulement parler. Il faut que tout ça soit bien clair avant de décider comment l'implémenter, parce que ça peut changer pas mal d'un système à un autre.
              • Partager sur Facebook
              • Partager sur Twitter
                15 octobre 2010 à 11:55:01

                Citation : Maxibolt

                if message_recu.startswith("dire"):
                    liste_de_mots_a_dire = message_recu.split()[:1] #pour récupérer tous les éléments sauf le premier
                    for mot in liste_de_mots_a_dire:
                        envoyer(mot)
                


                Désolé pour ce post pas très constructif, mais je crois que ce serait plutôt :
                #...
                liste_de_mots = message_recu.split()[1:] # pour récupérer tous les éléments sauf le premier
                #...
                
                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  15 octobre 2010 à 14:25:01

                  Euh, oui, je croyais avoir éditer mais apparemment j'ai oublié ça. Merci, je corrige.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  serveur/client aide

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown