Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide pour serveur/client

Envoi d'une chaine de caractères superieur à 1024 bits

    6 février 2017 à 17:10:04

    Bonjour,

    J'ai créé un petit programme dont une option permet d'envoyer des données recuperer dans la mémoire d'un appareil vers un autre appareil. J'ai donc creer un petit script serveur/client.

    Mais je me suis vite rendu compte que l'envoie de chaine de caractères ayant une taille elevé (dans mon cas 40000000 caractères ) remettait en cause mon scripts

    J'ai donc rajouter un peu de code :

    Le client divise en n partie de 1024 caractere notre chaine de caractere.

    Il envoie le nombre n au serveur

    Gràce à une boucle sur les 2 scripts, le client envoie partie par partie et le serveur est censé les recupérer dans l'ordre ...

    J'ai remarqué que même avec un time.sleep (0.5) entre chaque envoie au serveur .... le serveur qui additionne chaque partie se retrouvait à la ramasse et quand j'affiche la chaine finale censé etre la chaine de caractères initiale, le serveur m'affiche 'killed'.

    D'ou je viens ici vous demander de l'aide ...

    J'aprecierai toute aide !

    Merci d'avance

    -
    Edité par CédricFARINAZZO 15 février 2017 à 14:07:54

    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2017 à 19:31:27

      Salut,

      Vous pourriez nous donnez un aperçu de votre code.

      Cela nous donnerait une chance de comprendre votre erreur et de vous l'expliquez.

      PS: Mettre votre code dans les balises prévus à cet effet.

      Bonne chance

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        6 février 2017 à 20:41:18

        Voici mon code :

        <ligne>

        def serveur (hote = '',port = 1234):

            connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            connexion_principale.bind((hote, port))

            connexion_principale.listen(5)

            print("Le serveur écoute à présent sur le port {}".format(port))

            connexion_avec_client, infos_connexion = connexion_principale.accept()

            contenu = ''

            nb = connexion_avec_client.recv(1024)

            nb = int (nb.decode ())

            i = 0

            print  (nb)

            while i != nb:

                msg_r = connexion_avec_client.recv (102400)

                msg_r = msg_r.decode ()

                contenu += msg_r

                i += 1

            connexion_avec_client.close()

            connexion_principale.close()

            return contenu

         --------------

        def client (contenu,hote = '',port = 12345):

            connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            connexion_avec_serveur.connect((hote, port))

            print("Connexion établie avec le serveur sur le port {}".format(port))

            time.sleep(3)

            n = 1024

            dim = len (contenu)

            nb_p = int (dim/n) + 1

            if (dim/n) <= 1:

                nb_p = 1

            i = 0

            j = 0

            a = 1

            con = []

            while a <= nb_p:

                j += n

                con.append (contenu [i:j])

                i += n

                a += 1

            nb = str (nb_p).encode ()

            connexion_avec_serveur.send(nb)

            contenu = contenu.encode ()

            time.sleep (2)

            i = 0

            while i != nb_p:

                co = con[i]

                co = co.encode ()

                connexion_avec_serveur.send(co)

                time.sleep (0.08)

                print (i)

                i += 1

            connexion_avec_serveur.send(contenu)

            connexion_avec_serveur.close()

            return 0

         </ligne>

        -----------

        Quels sont les balises de code ?

        -
        Edité par CédricFARINAZZO 11 février 2017 à 17:24:21

        • Partager sur Facebook
        • Partager sur Twitter
          12 février 2017 à 18:48:54

          Salut,

          Entre les icônes 'Insérer image' et 'Émoticônes' il y a </> , et vous sélectionner python..

          De plus, il reçoit 102400 bytes dans la boucle while. Il ne compte donc, pas le nombre de paquets de 1024 bytes reçu.

          Vous devriez envoyez:

          • Soit deux message.. ( 1- nom de bytes, 2- les données )
          • Soit un message, mais plusieurs valeurs ( tuple ou dictionnaire  --> (nb_bytes, données) )

          Vous envoyez le nombre de paquets, qu'il doit recevoir (1024 * X paquets).. ensuite, la cible, reçoit les informations et compte le nombre de paquets, que vous lui avez données. Ainsi que les données eux-même.

          Exemple:

          Je t'envoie 12 paquets de 1024 bytes (ou je t'envoie 10000000 bytes, que vous diviser en 1024 = 12),

          Ensuite, la cible reçoit les données par paquets et compte le nombre de paquets (ou bytes total)

          -
          Edité par nolimitech 12 février 2017 à 18:58:11

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            12 février 2017 à 21:19:00

            80 000  caractères ? Le contenu d'un fichier quoi... Pourquoi pas un serveur FTP ?
            • Partager sur Facebook
            • Partager sur Twitter
              12 février 2017 à 23:08:12

              80000 caractères c'est 80 Ko, soit... que d'alle à notre époque.

              Découper enbpaquets de 1024 bytes, pourquoi pas, au moins un paquet ne prendra pas plus que le MTU d'une trame ethernet, mais en principe puisque tout ça passe par des sockets de type stream (soit, dans la.famille AF_INET, une connexion TCP/IP), on s'en fout un peu : il suffit au serveur d'envoyer tout ce qu'il a sans se poser de questions, et au client de tout lire (par blocs de N octets, par exemple 4096) jusqu'à ce que la taille du bloc qu'il vient de lire soit inférieure à 4096.

              -
              Edité par nohar 12 février 2017 à 23:09:40

              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
              Anonyme
                12 février 2017 à 23:20:54

                La question n'est pas vraiment là, je pars du principe que certaines choses sont plus adaptées que d'autres, et que si le boulot peut être fait plus rapidement et proprement, alors faut pas hésiter... c'est l'avantage du langage.

                Enfin comme ce n'est pas très clair quand à l'utilisation exacte de cette application client/serveur, j'évite de trop m'avancer tout de même.

                • Partager sur Facebook
                • Partager sur Twitter
                  13 février 2017 à 8:13:05

                  Cette ligne (entre toutes) me met la puce à l'oreille :

                  msg_r = connexion_avec_client.recv (102400)
                  

                  La valeur est beaucoup trop élevée.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                    14 février 2017 à 8:47:15

                    C'est bien 1024 et non pas 102400 

                    Juste moi qui fait des test xD


                    Merci Nohar pour l idée du découpage !

                    J'ai le contenu d'un fichier de 50 mo à envoyer xD

                    -
                    Edité par CédricFARINAZZO 14 février 2017 à 8:51:59

                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 février 2017 à 14:06:39

                      Bon avec la technique de Nohar ca marche mais le serveur perd 60% des paquets envoyé..... seulement 40% sont recupérer.

                      Avez vous une idée contre ce probleme ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        15 février 2017 à 14:59:57

                        Tu peux même monter à 4096, sans problème... mais ta boucle qui permet de recevoir le message, il faudrait contrôler sa sortie, en vérifiant que la longueur du message est inférieure au buffer (1024 ou 4096 par exemple).

                        Un truc du style

                        if len(msg_r) < 1024: # ou 4096
                            break



                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 février 2017 à 18:14:37

                          J'ai déjà fait ca.

                          Et maintenant ca marche bien.

                          Et je suis monté à 4096 pour povoir transferer 50mo en 20min 

                          (2h avec 1024)

                          J'ai un autre probleme ....

                          C'est que les paquets qui n etais pas arrivé sont arrivés lorsque j'ai ouvert une nouvelle connexion .....

                          Comment vider le reseau local ? 

                          Serait il utile de changer de port ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            15 février 2017 à 19:08:43

                            CédricFARINAZZO a écrit:

                            J'ai déjà fait ca.

                            Où ça ?

                            Car quand je lis

                            CédricFARINAZZO a écrit:

                            J'ai un autre probleme ....

                            C'est que les paquets qui n etais pas arrivé sont arrivés lorsque j'ai ouvert une nouvelle connexion .....

                            Comment vider le reseau local ? 

                            Serait il utile de changer de port ?

                            Je me dis que la boucle n'est peut-être pas interrompu au moment voulu, mais avant que l'ensemble des données soient écrites...

                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 février 2017 à 19:13:51

                              Utilises une connexion TCP pour ne plus avoir de packets perdus
                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 février 2017 à 20:04:26

                                En fait ca marche pour les petits trucs à envoyer . Genre 3 voir 10 paquets ca marchait .....

                                Parce que la je veux envoyer 11 000 paquets de 4096. Et ca me donne 12 000 paquets de 4096 à l'arrivée ...

                                Donc je pense ca bug .....

                                Le module socket utilise une connexion TCP il me semble ?

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 février 2017 à 20:11:26

                                  Oui, pardon, je n'avais pas vu que tu étais en STREAM...

                                  Je te conseille de faire un système de debuggage, un peu comme un log, dès que tu envoies, tu écris le message dans un fichier et celui qui reçoit fait pareil des qu'il reçoit le message. Essaye de voir si c'est au même endroit, si ca revient toujours au même moment,... ;)

                                  -
                                  Edité par Varan1 15 février 2017 à 20:14:31

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 février 2017 à 21:15:40

                                    D'accord et j'affiche les différences...

                                    Mais ensuite comment les resoudre ?

                                    [Edit]

                                    C'est bon tous marche à merveille sans perte de données !

                                    Merci à tous !

                                    -
                                    Edité par CédricFARINAZZO 15 février 2017 à 21:36:52

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 février 2017 à 21:24:58

                                      Ça dépend, si c'est un problème de character, tu devras changer l'encodage, sinon, il faut voir pourquoi ça bloque...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 février 2017 à 23:34:34

                                        Tous marche c'est bon !

                                        C'etais juste un time.sleep (0.2) dans la boucle qui causait problème....

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Aide pour serveur/client

                                        × 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