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 :

Serveur Indy VCL et Client Indy FMX


Sujet :

Web & réseau Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut Serveur Indy VCL et Client Indy FMX
    Bonjour à tous,

    voilà une question que je me pose avant de ma lancer dans la réécriture ou l'écriture d'un programme client serveur.

    un serveur VCL écrit avec des composants Indy peut-il converser avec un Client FMX écrit avec des composants Indy ?

    merci de vos retours.

  2. #2
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Bonjour Georges,

    Les mots clients et serveurs sont très génériques.
    On peut parler de serveur de données, serveur de fichier, et pourquoi pas serveur d'interfaces etc..
    Peux tu nous donner quelques exemples ?
    Par exemple, si tu établis une communication TCP/IP entre deux PC pour échanger quelques données numériques, le protocole d'échange est donc sur le TCP.
    Dans ce cas, que ce soit avec la librairie VCL ou FMX cela n'a aucune importance. La différence entre ces deux "framework" est surtout liée à l'interface.

    Franck

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    bonsoir franckcl,

    merci de ton retour.

    effectivement j'aurai dû être plus précis, cependant j'ai toutes mes interrogations dans ton message.

    encore merci

  4. #4
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    @Georges P
    je suis intéressé par ce sujet, et comme toi (je suppose) je souhaite coder un client tcp ip
    j'aimerais bien quelques infos sur ce que tu utilises exactement comme composant, car j'utilise des anciens, je n'ai jamais accroché aux compo indy qui étaient inclus avec delphi 7

    @franckcl
    j'entends que ça, que la différence entre vcl et fmx n'est que sur l'interface graphique
    est ce que ça veut dire que tous les composants compatible delphi 7 le seront sous rio ?
    je ne pense pas forcément ? par ex les compos ICS, sur la page de l'auteur, la prochaine version sera compatible android d'après ce qui est écrit
    étant non visuel, pourquoi à t il besoin de les rendre compatibles ?
    en même temps ça doit faire 2 ans qu'il a fait l'annonce

  5. #5
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Citation Envoyé par Coussati Voir le message
    @Georges P
    j'entends que ça, que la différence entre vcl et fmx n'est que sur l'interface graphique
    Oui tu as tout à fait raison, c'est pourquoi j'ai dit que la différence était surtout liée à l'interface graphique. sous entendu "pas que"

    ;-)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Bonjour Coussati,

    de mon côté, ayant déjà fait ce genre de programme en VCL, j'utilise les composants INDY côté serveur :
    • IdCmdTCPServer
    • IdAntiFreeze


    et côté Client :
    • IdTCPClient
    • IdAntiFreeze
    • IdCompressionIntercept

  7. #7
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    bonjour,

    Je développe un logiciel de supervision industrielle qui est commercialisé depuis 2014 et qui communique avec beaucoup d'appareils en TCP/IP. Il est aussi serveur TCP/IP.
    Ce logiciel tourne H24 pendant des mois sans interruption et est utilisé sur beaucoup de machines partout à travers le monde.
    J'ai testé pas mal de solutions pour gérer les sockets et je me souviens avoir eu pas mal de soucis avec les solutions Indy notamment au niveau du blocage.
    Il me fallait trouver des composants non bloquant.
    Et finalement, je me suis tourné vers les objets:
    - TTcpClient qui faisait parti d'une ancienne version de Delphi mais qui est toujours compatible avec la dernière version 10.3.3 (voir unité ci-jointe)
    - TServerSocket de l'unité "System.Win.ScktComp"

    Si tu veux des exemples d'utilisation, dis le moi.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Merci de ton retour.

    je suis toujours preneur d'exemples, c'est sympa

    si tu en as, je m'en inspirerai…

    bonjour journée et prends soin de toi !

  9. #9
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Citation Envoyé par Georges P Voir le message
    je suis toujours preneur d'exemples, c'est sympa
    si tu en as, je m'en inspirerai…
    Création du client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      TcpClient1           := TTCPClient.Create(Application);
      TcpClient1.Blockmode := bmNonBlocking;
      TcpClient1.OnError   := TcpClient1Error;
    Gestion de l'erreur du client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //------------------------------------------------------------------------------------------------------------------------------
    procedure TMySocket.TcpClient1Error(Sender: TObject; SocketError: Integer);
    Var S : String;
    Begin
      if (SocketError<>10035) then  // the code 10035 is normal: operations on nonblocking sockets that cannot be completed immediately
      Begin
        // Logger ou afficher l'erreur ici.
      End;
    End;
    Gestion des erreurs:

    Envoi et lecture d'une trame:
    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
     
    //------------------------------------------------------------------------------------------------------------------------------
    Function TMySocket.SendFrame(TxData:PByte;len:integer):boolean;
    Var
     n : integer;
     buf : array[0..100] of byte;
    Begin
      try
       // Clear reception buffer
       n:=1; while n>0 do n:=TcpClient1.ReceiveBuf(buf[0],sizeof(buf));
       // send the frame
       n:=TcpClient1.SendBuf(TxData^,len);
       result := (n=len);
      except
        result:=false;
      end;
    End;
    //------------------------------------------------------------------------------------------------------------------------------
    function  TMySocket.ReadFrame(RxData:PByte;RxDataSize:integer):integer; 
    Begin
      try
        result := TcpClient1.ReceiveBuf(RxData[0],RxDataSize);
        if (result<=0) then result:=0;
      except
        result:=0;
      end;
    End;

    Boucle d'execution

    (J'ai juste copier/coller mon code, donc il y a pas mal de truc qui ne te serviront pas)
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    Procedure TMySocket.loop;
    Var
      okselect,bReadReady, bWriteReady, bExceptFlag : boolean;
    Begin
     Try
      case step of
         S_DISABLED : ;   // do nothing
         S_DELAY_BEFORE_CX:
           Begin
             if getlapsTickCount(TMO)> TimeBeforeCx then Step:=S_CONNECTION;
           End;
         S_CONNECTION :   // Connexion requested
            Begin
              TMO                := GetTickCount;
              LastErrorMsg       := 'Connecting';  // used by the inherited class to diplay hint message
              LastErrorTime      := now;
              SocketErrCode      := 0;
              if not(RegErrStatus) and (NbTry=0) then  MyLog.LogEvent('',ChamberId,li_SOCKET_CONNECTING,LOG_COM,EL_NONE,'['+Name+']'+' Attempt to connect to IP='+IPAdr+' and port='+IntToStr(Port));
              LastOpenTime       := now;
              try
                TcpClient1.Close;
                TcpClient1.RemoteHost:= IPAdr;
                TcpClient1.RemotePort:= IntToStr(Port);
                TcpClient1.Open;
              except
              end;
              Step               := S_WAIT_CONNECTION;
            End;
         S_WAIT_CONNECTION: // Waiting for connection
            Begin
              try
                okSelect:=TCpClient1.Select(@bReadReady, @bWriteReady, @bExceptFlag);
              except
                okselect:=false;
              end;
              if okselect and bWriteReady and (TcpClient1.Active) then
              Begin
                NbTry := 0;
                inc(CounterConnect);
                DateConnected := now;
                step          := S_DELAY_AFTER_CONNECTION;
                LastErrorMsg  := 'Connected';  // used by the inherited class to diplay hint message
                LastErrorTime := now;
                SocketErrCode := 0;
                TMO           := GetTickCount;
                SetErrStatus(false); // This will dispatch the information to all module which are connected to this socket with the SetErrStatus function
                if RegSecEnabled then MyLog.logEvent('',ChamberId,li_SOCKET_CONNECTED,LOG_COM,EL_RESTORED,'['+Name+']'+' Connected to IP='+IPAdr+' and port='+IntToStr(Port));
              End else // not connected !
              Begin
                if (GetLapsTickCount(TMO)>TMO_RECONNECT_ONERROR) then  // if error occured (OnError) then after TMO_RECONNECT_ONERROR = 9s
                Begin
                  inc(NbTry);
                  if (NbTry>4) and not(RegErrStatus) then
                  Begin
                    MyLog.logEvent('',ChamberId,li_SOCKET_TMO,LOG_COM,EL_CRITICAL,'['+Name+']'+' Time out occured while trying to connect to IP='+IPAdr+' and port='+IntToStr(Port));
                    SetErrStatus(true); // This will dispatch the information to all module which are connected to this socket with the SetErrStatus function
                  End;
                  step:=S_CONNECTION; // if the timeout is reached then try to reconnect
                End;
              End;
            End;
           S_DELAY_AFTER_CONNECTION:
            Begin
              if getLapsTickCount(TMO)>TimeAfterCx then
              Begin
                TMO := GetTickCount;
                step:= S_LOOP_COM;
              End;
            End;
           S_LOOP_COM: // idle step
            Begin
              // Check connection and if error, log error and reconnect
              if SocketErrCode<>0 then
              Begin
                MyLog.LogEvent('',ChamberId,li_SOCKET_LOST_CONNECT,LOG_COM,EL_WARNING,'['+Name+']'+' Loss of connection to IP='+IPAdr+' and port='+IntToStr(Port)+' with error #'+IntToStr(SocketErrCode));
                TMO := GetTickCount;
                step:=S_TMO_BEFORE_RECONNECT;
              End;
            End;
           S_TMO_BEFORE_RECONNECT:
           Begin
             if GetLapsTickCount(TMO)>TMO_RECONNECT_ONERROR then Step:=S_CONNECTION;
           End
         else step:=S_CONNECTION;
      end; // end case
     except
      LogExceptionInConsole('Exception in Socket_module function loop');
     End;
    end;

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    super !

    merci de ton aide, je vais regarder cela et reviens vers toi au besoin.

    A+

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Coussati Voir le message
    étant non visuel, pourquoi à t il besoin de les rendre compatibles ?
    Vous oubliez l'OS et les APIs réseaux différents sur chaque donc un composant TCP doit contenir l’implémentation de tous les OS ciblés pour être "compatible"

    Sinon, un Serveur HTTP (TCP/IP) sur Windows et un Client Mobile est depuis longtemps la solution du développeur Delphi pour faire du N-Tiers avec DataSnap REST depuis que FMX existe.
    D'ailleurs, le composant TRESTClient est le composant essentiel pour un accès REST (testé sur MS Graph, OAuth2.0) qui est multiplatforme, il est basé en interne sur Indy, si cela peut vous rassurer.

    Pour l'utilisation directe d'un TIdTCPServer, dans le cadre d'une application serveur hautement sollicité, il faut impérativement développer en mode Thread avec un Thread par Context (ou si le nombre est trop élevé, via des Pools)
    TServerSocket est strictement WinAPI mais j'ai aussi une préférence pour sa simplicité (idem, je recommande en Serveur le mode Blocking avec des implémentations de TServerClientThread et TWinSocketStream comme ici )

    D'ailleurs, la question "Serveur Indy VCL et Client Indy FMX" est très limitée, un Server TCP/IP ou HTTP, FTP ... doit respecter le protocole mentionné et pour que cela soit considérer comme une respecté, le serveur DOIT être utilisable avec par exemple Java, PHP, C# ...
    A Quoi servirait une implémentation d'un serveur FTP en Delphi via un TIdFTPServer si il n'était utilisable qu'avec un TIdFTPClient, alors que je peux garantir, qu'il fonctionne avec un BAT, le classique FileZilla et un programme C# comme Clients.
    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

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    @ShaiLeTroll je faisais un peu d'humour concernant ICS parce que sur le site officiel, la compatibilité android est prévu "soon" depuis quelque temps déjà
    je trouve aussi que quelque soit le composant, d'autre technologie devrait pouvoir utiliser le même protocole, après je ne suis pas très technique, je suppose juste que certaines choses ne fonctionnent pas partout
    par ex j'ai essayé de connecter un Tclientsocket à un Ttcpserver, ça n'a pas fonctionné
    sinon j'entends de plus en plus qu'il est préférable de passer par un Thread plutôt que par les événements ! d'utiliser du bloquant ? je ne sais pas pourquoi, je trouve tellement pratique un évènement "on_receive" par exemple

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    ICS, je ne connais que de nom

    En D5, j'ai connecté un socket Windev 7.5 Beta (foireux en 7.0 sur les données binaire contenant un zéro) sur un TServerSocket, par contre l'inverse, je confirme que cela était instable car la gestion des threads de Windev à l'époque était un catastrophe, un Listen dans deux threads simultanés, pour deux ports TCP et des connexions trop rapprochées temporellement portait le même ID unique, oui la bonne blague, réponse du Support : "Windev n'est pas adapté à vos besoins !", lol, comme si j'avais pas déjà tout réécrit en Delphi, déjà parce que la version en Windev avait faite par un stagiaire qui n'avait rien compris au projet, ni le prestataire, ni le fournisseur, ni même l'associé n'avait entendu de lui et mon chef de l'époque qui me disait que j'avais juste à tester un programme terminé, alors que le protocole machine n'était même pas encore validé

    En D7, j'ai connecté du TClientSocket (déprécié à ce moment) sur un TTCPServer, ainsi qu'un client TIdTCPClient v9, un Telnet aussi.

    Rien ne vaut telnet comme client si tu veux etre certain que la connexion en mode texte fonctionne
    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

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

Discussions similaires

  1. [Web/Reseaux] Serveurs Web en C++ : serveur INDY ou CGI ?
    Par Argol_Medusa dans le forum C++Builder
    Réponses: 0
    Dernier message: 26/03/2012, 17h10
  2. Réponses: 3
    Dernier message: 25/10/2008, 17h35
  3. [Utilisation] Comparaison des versions sur le serveur et sur le client
    Par ruff15 dans le forum CVS
    Réponses: 1
    Dernier message: 18/03/2007, 15h54
  4. Réponses: 3
    Dernier message: 02/07/2006, 13h17
  5. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40

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