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

Web & réseau Delphi Discussion :

Indy : problème a la fermeture du client


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 22
    Par défaut Indy : problème a la fermeture du client
    Bonjour à tous,
    Après avoir cherché pendant 2 jours sur internet sans succès (ou j'ai vraiment pas de chances) je me décide a poster un message dans l'espoir qu'une personne pourra me donner la solution.

    Le système :
    J'ai deux applis qui tournent sur des machines distinctes, l'une serveur et l'autre client.
    Le serveur envoie régulierement et aléatoirement des infos au client qui permettent de mettre a jour une IHM sur l'évolution d'une plateforme robotisée. Le client est bloqué sur un readinteger pour obtenir la taille du stream a recevoir.

    Lorsque le serveur est déconnecté je peux sans problème fermer le client. En effet les méthodes read, bloquantes, testent régulièrement la viabilité de la connection et lèvent une exception que je traite si on perd la connection.

    Mon soucis est l'autre cas. C'est a dire quand le client veut se déconnecter alors que le serveur tourne toujours. Etant donné qu'il n'y a pas coupure de connection mon appli cliente est figé car le thread de réception ne se termine pas et reste bloqué sur le readinteger.

    Voici le code de mon 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    procedure TCycle.Execute;
    begin
      Connection;
      msg := 'Client connecté au serveur Frontal';
      Synchronize(AddMessage);
      try
        while not Terminated do
          begin
            with Client do
              begin
                // Do your communication here
                try
                  [b][color=orange]Size := ReadInteger;[/color][/b]  //  <-Bloqué ici si je ferme alors que le serveur tourne toujours
                  ReadStream(MemStream,Size,False);
                  MemStream.Position := 0;
                  Synchronize(AddStream);
                except
                  on E : EIdException do
                    begin
                      // On a perdu la liaison avec le Frontal, on relance la connection
                      if not Terminated then
                        begin
                          msg := 'Connection perdue. Nouvelle tentative de connection';
                          Synchronize(AddMessage);
                          Connection;
                        end
                      else
                        begin
                          Break;
                        end;
                    end;
                end;
              end;
          end;
      finally
        sleep(50);
        Deconnection;
      end;
     
    end;
    Le code du serveur :
    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
     
    procedure TMainForm.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
      MemStream : TMemoryStream;
      TempStr : String;
      nb : integer;
    begin
      try
        with AThread.Connection do
          begin
            while cmdQueue.Count > 0 do
              begin
                MemStream := cmdQueue.items[0];
                MemStream.Position := 0;
                WriteInteger(MemStream.Size);
                WriteStream(MemStream,True,False);
                CmdQueue.Delete(0);
                sleep(100); // Attente entre chaque envoi
              end;
          end;
      except
      end;
    end;
    Si une personne a la solution a mon problème je l'en remercie d'avance

    J'oubliais je suis sous D7 Pro avec Indy 9

    Sylvain

  2. #2
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 22
    Par défaut
    Bon j'ai finalement trouvé la solution. Bien que perso je la trouve pas tres propre je vous la donne.

    Dans ma fiche thread client j'ai mis en public une procédure qui exécute la ligne de code suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Client.Socket.Close; // Client de type TIdTCPClient
    En gros je ferme le canal tcp à la source de manière a ce que la fonction ReadInteger, qui teste périodiquement la connection, voit qu'elle est coupé et donc lève une exception que je traite.

    Si vous avez des suggestions je suis a votre ecoute

    Sylvain

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème tutoriel de fermeture automatique
    Par mathilde50 dans le forum Access
    Réponses: 2
    Dernier message: 17/08/2006, 10h47
  2. Fermeture des clients d'un serveur automation
    Par agthomas dans le forum MFC
    Réponses: 1
    Dernier message: 29/06/2006, 09h05
  3. Problème d'évenement ! Fermeture non demandée.
    Par killprog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/02/2006, 10h18
  4. Réponses: 6
    Dernier message: 17/11/2005, 14h39
  5. Réponses: 5
    Dernier message: 24/09/2005, 20h31

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