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

Composants VCL Delphi Discussion :

Utilisation de TTcpServer, problème avec le mode bmThreadBlocking


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 36
    Par défaut Utilisation de TTcpServer, problème avec le mode bmThreadBlocking
    Bonjour,

    J'essaie depuis plusieur jour de créer un application client serveur mais je rencontre quelques soucis.

    J'initialise le composant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Configurations.
    FTCPServeur.LocalHost := '127.0.0.1';
    FTCPServeur.LocalPort := '10000';
    FTCPServeur.BlockMode := bmThreadBlocking;
     
    // Evénements.
    FTCPServeur.OnGetThread := EvtGetThreadEvent;
    FTCPServeur.OnAccept    := EvtOnAccept;
    Donc j'ai deux événement à gérer qui sont codés comme ça :

    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
     
    //-----------------------------------------------------------------------------
    // Création d'un thread pour le nouveau client.
    //-----------------------------------------------------------------------------
    procedure TC6CCServer.EvtGetThreadEvent(Sender : TObject; var ClientSocketThread : TClientSocketThread);
    begin
      ClientSocketThread := TC6CCIPClient.Create(FTCPServeur.ServerSocketThread);
    end;
    //-----------------------------------------------------------------------------
    // Après acceptation de la connexion d'un client.
    //-----------------------------------------------------------------------------
    procedure TC6CCServer.EvtOnAccept(Sender : TObject; ClientSocket : TCustomIpClient);
    begin
      // Message de bienvenue.
      ClientSocket.Sendln('Bonjour !');
    end;
    TC6CCIPClient étant une fille de la classe TClientSocketThread avec une surcharge de la méthode execute.

    Je me connecte en telnet sur mon serveur. Pas de soucis je passe bien dans les deux événements et le message 'Bonjour' me parvient correctement. Mais tout de suite après la connexion est coupée alors que je souhaiterais la maintenir tant que le client n'a pas envoyée une commande de déconnexion.

    Il y a aussi un truc bizarre sur l'objet TClientSocketThread. L'aide delphi à propos du constructeur dit ça :

    Syntaxe Delphi :

    constructor Create (ServerSocketThread: TServerSocketThread; ClientSocket: TCustomIpClient);
    alors que le code de cette classe n'accepte qu'un seul paramètre de type TServerSocketThread, je trouve ça étrange.

    Merci d'avance pour vos réponses et je vous souhaite une agréable journée.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    JE suis plus habitué au composant TServerSocket ... mais j'ai un peu bossé avec le TCPClient aussi ...

    ta classe TC6CCIPClient est un Thread (hérité de TClientSocketThread), as-tu modifié le Execute ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Inscrit en
    Octobre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 36
    Par défaut
    Oui oui j'ai redéfinie. D'ailleur en débuguage on passe bien dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TC6CCIPClient.Execute;
    begin
      inherited;
     
      sleep(10000); // Code à la noix pour voir si on passe par ici.
     
    end;
    J'ai été voir dans le code de la fonction TClientSocketThread.Execute (correspond au inherited de ma fonction) et il crée bien un TCustomIpClient qui est le socket en lui même puis appel la méthode EvtOnAccept que j'ai montrer plus haut mais juste après il détruit le TCustomIpClient (ce qui coupe la connexion je pense) et met le thread en pause (donc on arrive jamais au sleep(10000) de ma méthode execute).

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Vu le code source du composant, il me semble que tu devrais écrire tout ton code d'écoute de client dans le OnAccept du Serveur, cet évènement est déclenché par le thread ... tu n'as pas à faire toi même le thread semble-t-il ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Problème avec le mode graphique
    Par dot-_-net dans le forum C++
    Réponses: 6
    Dernier message: 27/12/2007, 18h54
  2. Problème avec le mode debug
    Par mambo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/09/2007, 13h10
  3. [TP] Problème avec le mode VESA
    Par dectroo dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 29/01/2007, 13h44
  4. problème avec setsockopt() mode RAW
    Par poporiding dans le forum Windows
    Réponses: 20
    Dernier message: 25/04/2006, 14h41
  5. problème avec setsockopt() mode RAW
    Par poporiding dans le forum C++
    Réponses: 15
    Dernier message: 24/04/2006, 17h17

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