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 :

[Réseau]IdTCPServer et déconnexion


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Par défaut [Réseau]IdTCPServer et déconnexion
    Bonjour,

    je met en place pour le boulot une application client/server qui permet d'envoyer des fichiers en ensuite de les traiter.
    Mais seulement voilà, les fichiers peuvent être envoyé de chez des particuliers via leurs lignes internet, ce qui signifie ADSL voir même ... 56K et j'aimerai donc pouvoir gérer les éventuelles déconnexion.

    Le problème que j'ai, c'est que je n'arrive pas à faire "comprendre" au server qu'il a perdu sa connexion avec le client, quelqu'un aurait il une idée?

  2. #2
    Membre éprouvé

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Par défaut
    Salut,

    Moi je ferais comme ca...
    Dans l'évènement OnExecute de ton TCPServer tu essaye de récupèrer les données envoyées par le client avec une gestion d'exeception. Si il n'y a pas de bug test aussi dans un try...except...end les valeurs de ton enregistrement . Si tu obtient une erreur s'est qu'il y a eu un pb de transfert.
    Tu pourrais aussi vérifier la connexion du client en permanence avec un ping !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Par défaut
    C'est exactement ce que je fais, toute ma fonction OnExecute est dans un try ... except mais le problème, c'est quand je coupe ma connexion, le server ne semble pas se rendre compte que la connexion à été interrompue et donc ... le try except ne s'exécute pas

    J'ai un IdAntiFreeze sur ma form client et server, cela pourrait être une source de problème?

    Pour info, je suis connecté avec mon portable via adsl/vpn et l'ordinateur à cote de moi est sur le réseau local. Je suis donc dans le cadre identique de sa future utilisation

    Edit : pour info, si je fais un disconnect proprement pendant que le IdTcpClient envoie les informations, tout fonctionne bien.
    Je n'ai le problème que lorsque je fais un disconnect brutal (coupure de la ligne)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Par défaut
    Personne n'a d'idée?

    Je ne sais pas comment faire "comprendre" a mon server que la connexion est interrompue, j'ai essayé de diminuer les timeout mais rien n'y fait

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Par défaut
    J'ai affiné un peu plus le problème, visiblement le problème vient de mon stream.

    Si je coupe ma connexion pendant l'instruction suivante : AContext.Connection.IOHandler.ReadStream(FmlStream,ByteCount);
    aucune erreur n'est générée et le server ne réagit plus.
    Je suppose donc qu'il reste bloqué à cet endroit.
    Quelqu'un a t il une idée de ce qui pourrait bloquer?

    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
     
      Line := AContext.Connection.IOHandler.ReadLn(); 
      i := Pos(' ',Line);
      if (i>0) and (LowerCase(Copy(Line,1,Pred(i)))='fmlfile') then
      begin
        ByteCount := AContext.Connection.IOHandler.ReadInt64();
        FmlStream := TIdStreamVCL.Create(TFileStream.Create(FileDirectory + RayT.FileName + '_' + RayT.CameraView + '.fml',fmCreate),True);
        try
          AContext.Connection.IOHandler.ReadStream(FmlStream,ByteCount);
          Memo1.Lines.Add(IntToStr(ByteCount));
        finally
          Memo1.Lines.Add('FmlStream finally');
          FreeAndNil(FmlStream);
        end;
        AContext.Connection.IOHandler.WriteLn('Fichier envoyé FML File');
      end
      else  AContext.Connection.Disconnect;

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Par défaut
    J'ai trouvé une solution qui semble marcher en ce moment mais je n'ai pas encore su tester plus en profondeur.

    J'ai rajouté un Timeout à l'IOHandler juste avant le ReadStream

    AContext.Connection.IOHandler.ReadTimeout := 1000;

    Ce qui donne le code suivant
    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
     
      Line := AContext.Connection.IOHandler.ReadLn(); 
      i := Pos(' ',Line); 
      if (i>0) and (LowerCase(Copy(Line,1,Pred(i)))='fmlfile') then 
      begin 
        ByteCount := AContext.Connection.IOHandler.ReadInt64(); 
        FmlStream := TIdStreamVCL.Create(TFileStream.Create(FileDirectory + RayT.FileName + '_' + RayT.CameraView + '.fml',fmCreate),True); 
        try 
          ***AContext.Connection.IOHandler.ReadTimeout := 1000;***
          AContext.Connection.IOHandler.ReadStream(FmlStream,ByteCount); 
          Memo1.Lines.Add(IntToStr(ByteCount)); 
        finally 
          Memo1.Lines.Add('FmlStream finally'); 
          FreeAndNil(FmlStream); 
        end; 
        AContext.Connection.IOHandler.WriteLn('Fichier envoyé FML File'); 
      end 
      else  AContext.Connection.Disconnect;

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

Discussions similaires

  1. IdTCPServer Détecter déconnexion
    Par rvzip64 dans le forum Composants VCL
    Réponses: 0
    Dernier message: 27/10/2008, 11h06
  2. [ASE 12.5] Pb lors d'une déconnexion réseau
    Par jokos2000 dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 17/09/2007, 09h47
  3. Problème Forward et Déconnexion réseau
    Par denielig dans le forum Struts 1
    Réponses: 1
    Dernier message: 26/02/2007, 18h05
  4. [Réseau sans fil] Déconnexions régulières
    Par Jfriche dans le forum Hardware
    Réponses: 6
    Dernier message: 01/01/2006, 21h40
  5. Déconnexion réseau
    Par esa dans le forum Web & réseau
    Réponses: 3
    Dernier message: 22/06/2004, 07h55

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