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 :

Comment fonctionnent IdTCPClient1 et IdTCPServer1 ?


Sujet :

Web & réseau Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut Comment fonctionnent IdTCPClient et IdTCPServer ?
    salut

    je sais que c'est beaucoup demandé, mais j'aimerais que quelqu'un qui sait utiliser ces composant me fasse un pti exemple de communication :

    client ==> serveur

    serveur ==> clients

    car je n'arrive pas à les utiliser (et c'est eux qu'il me faut utiliser)

    j'ai trouvé un seul exemple et c'est sur delphi fr mais la source était trop brouillon j'ai pas compris

    sur le serveur ça peut allé mais côté client je ne comprend pas, il n'y a pas d'évènement

    merci d'avance à vous tous

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    alors ? personne pour m'aider ?

    ou alors c'est vraiment pas facile à les utiliser ? :/

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    je viens de trouver un exemple :

    http://www.projectindy.org/DemoDownl...os_26Oct04.zip

    mais pas super ... le client se block

    on dirait que c'est à cause du timer, mais bon jse pas ...

    qu'en pensez vous ?

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    je pense que tu devrais commencer à chercher à comprendre ce que tu fais

    au passage il y a un chapitre complet sur la programmation TCP/IP dans le livre "Delphi 7 Studio"

    personnellement je n'utilise aucun des composants classiques (ICS, Indy, etc...) car à mon sens, quand tu travailles sur un protocol maison, ils n'apportent pas grand chose sur l'API Winsock...quand tu fais du HTTP, FTP, SMTP, etc...c'est une autre histoire (bien que je ne les utilise pas non plus dans ce contexte).

    donc avant d'utiliser ces composants il te faut comprendre les notions de client, de serveur, de numéro de port, il faut savoir ce que sont UDP et TCP, un socket "bloquant" et un socket asynchrone. Une fois ces notions maitrisées, le composant ne devrait plus te pauser de problème

    une bonne partie des réponses se trouve ici.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    salut

    j'ai déjà été sur ton site et je sais ce qu'est le socket blokant

    je pense qu'ici on doit coder l'évènement "on listen" mais je ne sais pas trop c'est quoi le meilleur moyen ...

    peut être carément mettre un timer ? et tester à chaque fois si le client a reçu des données ?

    c'est domage, même l'exemple du site officiel d'indy bloque ...

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut



    http://delphi.developpez.com/faq/?pa...eclientserveur

    Testé et fonctionnel (j'ai utilisé ce fonctionnement hier pour un programme)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Citation Envoyé par Rayek Voir le message



    http://delphi.developpez.com/faq/?pa...eclientserveur

    Testé et fonctionnel (j'ai utilisé ce fonctionnement hier pour un programme)
    merci pour le lien, je ne l'avais pas vu pourtant j'ai regardé la source de l'envoie du fichier

    par contre, j'ai bien compris que IdTCPClient.ReadLn() permet de lire ce que le serveur envoie au client, mais comment faire en sorte d'être à l'écoute ? le serveur peut communiquer à tout moment avec le client et donc il faudrait un évènement déclencheur non ?

    j'ai pensé vite fait à mettre dans un timer (réglé) à 1ms un code de teste à chaque fois, mais je ne sais pas si c'est la bonne solution

    if IdTCPClient.ReadLn() <> '' then ....


    autre chose : le serveur doit pouvoir envoyer un message à tout les clients, comment le faire ? dans la source on voit juste :

    AThread.Connection.WriteLn('message');

    or il y aura plusieurs clients connectés ...

    dans les autres compos que j'ai testé, on faisait tjrs une boucle sachant que l'objet server pouvait nous donner le nbr de clients connectés

    pouvez vous m'éclairer sur ces points svp ?

  8. #8
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    il me semble me souvenir que la grosse différence entre ICS et Indy c'est que le premier est en mode asynchrone (à base d'événements) alors que le second est en mode bloquant.

    Quand on travaille avec des sockets en mode bloquant, le plus simple est de mettre le traitement dans un thread qui pourra être bloqué sans soucis pour le reste de l'application.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    dites moi si je suis dans le faux

    je voulais utiliser indy, pour utiliser des socket de type bloquant, pour ne perdre aucune informations (échange de texte uniquement)

    car j'ai déjà essayé d'autres type de composant et à chaque fois il y a un problème :

    - TClientSocket et TServerSocket : souvent, tous les clients ne reçoivent pas les messages du serveur (par ex sur 50 on dira que 5 ne recevront pas)

    - TWATCPClient et T WATCPServer : proposé par waskol, tout fonctionne très bien, il y a des évènements, donc très facile d'utilisation (comme TClientSocket et TServerSocket d'ailleurs) et en plus ils sont bloquant (waskol me l'a assuré), sauf que récement j'ai rencontré un problème : au bout d'un certain moment, je ne sais pas pourquoi mais le serveur "deconne" et à chaque fois qu'un client essais de se connecter, le client plante (et se kill, chez moi le debogueur delphi souvre) je ne sais pas pkoi ce prob arrive ... peut être que trop de donnée ont été échangé ... je ne sais pas ... en tout cas je dois fermer et réouvrir le server ...

    du coup j'ai du me rabattre sur d'autres socket bloquant, ce qui m'a emmené vers indy, et là je lutte pour réussir à les faire s'échanger du texte ...

    j'aurai vraiment préféré garder TWATCPClient et T WATCPServer qui étaient génial jusque là

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    j'essaie de coder un pti exemple :

    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      IdTCPClient1.Host := '127.0.0.1';
      IdTCPClient1.Port := 2003;
      IdTCPClient1.Connect;
    end;
     
    procedure TForm1.IdTCPClient1Connected(Sender: TObject);
    begin
      showmessage('conecté au server');
    end;
     
    procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
    begin
      showmessage('déconecté au server');
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      IdTCPClient1.WriteLn('test');
    end;

    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
    24
    25
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      IdTCPServer1.DefaultPort := 2003;
      IdTCPServer1.Active := true;
    end;
     
     
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    begin
     showmessage('client conecté');
    end;
     
     
    procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
    begin
     showmessage('client déconecté');
    end;
     
     
     
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    begin
      showmessage('reception');
    end;
    dans cette source, je voulais qu'à chaque fois que je click sur le boutton 2 du client, l'évènement on execute du serveur se declanche

    OR

    je ne comprends rien : déjà quand je me connecte, sur le client j'ai un msg "conecté au server" donc c'est ok MAIS sur le serveur il y a qui se declanche d'affilé :


    showmessage('client conecté');
    showmessage('client déconecté');
    showmessage('reception');

    et après le prog plante

    donc je ne comprends pas

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par Coussati Voir le message
    par contre, j'ai bien compris que IdTCPClient.ReadLn() permet de lire ce que le serveur envoie au client, mais comment faire en sorte d'être à l'écoute ? le serveur peut communiquer à tout moment avec le client et donc il faudrait un évènement déclencheur non ?

    http://delphi.developpez.com/faq/?pa...s#indybindings

    Ton serveur est à l'écoute sur des paramètres que tu vas lui définir.
    Après il te suffit d'envoyer avec IdTCPClient sur le bon host et port pour que le serveur reçoive la question.


    Citation Envoyé par Coussati Voir le message
    autre chose : le serveur doit pouvoir envoyer un message à tout les clients, comment le faire ? dans la source on voit juste :

    AThread.Connection.WriteLn('message');

    or il y aura plusieurs clients connectés ...

    dans les autres compos que j'ai testé, on faisait tjrs une boucle sachant que l'objet server pouvait nous donner le nbr de clients connectés

    pouvez vous m'éclairer sur ces points svp ?
    Normalement, Le IdTCPServer va générer une session par personne qui se connecte sur lui donc, répondra indépendamment à chacun.
    En fait le OnExecute se déclenchera autant de fois que le nombre d'appel qu'il recevra.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Normalement, Le IdTCPServer va générer une session par personne qui se connecte sur lui donc, répondra indépendamment à chacun.
    mais si je veux que le serveur envoie un message à tous les clients, on fait comment alors ?

    pour le code source que j'ai fais ? qu'est ce qui ne va pas ?

    souvent mon pc se bloque lorsque je test en local

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    je pense avoir compris à peu près comment ça fonctionne

    Athread.Connection.WriteLn('xx');

    permet au serveur d'envoyer un message au client

    mais maintenant ce que je voudrais savoir, c'est comment avoir le nombre de client connecté au serveur ! et donc d'envoyer un message à tous les clients connecté !

    merci d'avance

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Paul TOTH ?

    Rayek ?

  15. #15
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    je ne sais pas comment fonctionne Indy...mais vu le mal que tu as, le net doit être en mal d'un tutorial sur son fonctionnement...comme tu te penches sur la question, je suis certain que tout le monde serait très content d'avoir un article de ta part sur la question

    bon sinon, sans savoir si cette information n'est pas déjà disponible dans l'objet serveur d'Indy...il suffit d'ajouter le client dans une liste à la connexion et de l retirer ensuite

    quelque chose du genre
    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
     
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
     list:TList;
     i:integer;
     peer:TIdPeerThread;
    begin
     ThreadList.Add(AThread);
     try
      ...
      list:=ThreadList.Lock;
      try
       for i:=0 to list.Count-1 do begin
        peer:=list[i];
        if peer<>AThread then peer.WriteLn('hello');
       end;
      finally
       ThreadList.UnLock;
      end;
      ...
     finally
      ThreadList.Remove(Self);
     end;
    end;
    ceci dit, je ne garanti pas que l'appel à peer.WriteLn soit threadsafe...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Pour ma part, je ne pourrais pas t'aider plus à ce niveau, j'utilise Indy10 contrairement à toi qui utilise Indy9 et je n'ai pas de poste pour mettre une veille version..
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    dsl paul, je n'arrive pas à comprendre ton code

    ceci dit j'avance à petit pas ...

    j'ai une source d'échange de string entre client et server qui marche impécable CAR il y a qu'un client connecté :

    Athread.Connection.WriteLn('le texte');

    lorsqu'il y a plus d'un client (j'ai testé avec 2) le server répond seulement au client qui a déclenché son "one execute" par un IdTCPClient1.WriteLn('texte');

    et là encore, j'aimerais que le serveur réponde à tous les clients connecté

    pourquoi il n'existe pas une fonction qui donne le nombre de client connecté et ainsi on ferait une boucle et envoie par indice ?

    ce serait tellement plus simple ...

  18. #18
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Coussati Voir le message
    dsl paul, je n'arrive pas à comprendre ton code

    ceci dit j'avance à petit pas ...

    j'ai une source d'échange de string entre client et server qui marche impécable CAR il y a qu'un client connecté :

    Athread.Connection.WriteLn('le texte');

    lorsqu'il y a plus d'un client (j'ai testé avec 2) le server répond seulement au client qui a déclenché son "one execute" par un IdTCPClient1.WriteLn('texte');

    et là encore, j'aimerais que le serveur réponde à tous les clients connecté

    pourquoi il n'existe pas une fonction qui donne le nombre de client connecté et ainsi on ferait une boucle et envoie par indice ?

    ce serait tellement plus simple ...
    de deux choses l'une, soit tu continues avec Indy et ce n'est visiblement pas ici que tu trouveras les réponses à tes questions.

    soit tu cherches à travailler autrement et on pourra t'aider.

    Personnellement je ne regarderais pas comment fonctionne Indy pour ton seul plaisir, désolé
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  19. #19
    Membre très actif
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    paul ça n'aurait pas été que pour moi, car je suis sur que je ne suis pas le seul à chercher ça et sur les forum français je n'avais rien trouvé; mais bon t'y étais presque ! avec un pti test rapide, je suis sur que tu aurais trouvé (mais bon je connais pas ton edt, peut être que tu n'as pas beaucoup de tps libre)

    en tout cas merci à vous tous quand même et spécialement à diden138, c'est ton 1er lien qui m'a donné la réponse, et il fallait le chercher car le poste est long

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            with IdTCPServer1.Threads.LockList do
             try
                for i := 0 to Count - 1 do
                begin
                    TIdPeerThread(Items[i]).Connection.WriteLn('msg que tout le monde recevra');
                end;
             finally
                IdTCPServer1.Threads.UnLockList;
             end;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [JSF] comment fonctionne <h:message> ?
    Par anitshka dans le forum JSF
    Réponses: 5
    Dernier message: 29/06/2005, 18h36
  2. Comment fonctionne TXmlDocumment ????
    Par almisuifre dans le forum C++Builder
    Réponses: 8
    Dernier message: 18/02/2005, 13h54
  3. comment fonctionne une interface graphique???
    Par elekis dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/10/2004, 00h10
  4. Comment fonctionne le ClassExplorer ?
    Par borisd dans le forum C++Builder
    Réponses: 7
    Dernier message: 30/09/2004, 18h44
  5. Comment fonctionne le CVS ?
    Par mathieu dans le forum CVS
    Réponses: 6
    Dernier message: 23/03/2004, 12h26

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