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] Intercepter les messages coté client


Sujet :

Web & réseau Delphi

  1. #1
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut [Indy] Intercepter les messages coté client
    Bonjour à tous,

    Je travaille actuellement sur une appli en architecture 3 tiers en utilisant les composants de la suite INDY IdTCPClient et IdTCPServer.

    Description succincte : un client a la possibilité de paramètrer un job. Ce job est transmis sous forme de message au serveur, qui va alors confirmer la bonne réception du job mais ne va pas le lancer de suite (gestion de files d'attente et de priorités de jobs).

    Donc le client a soumis un job, il peut accéder à d'autres écrans pour faire d'autres choses (affichage de stats, graphique,..).

    Coté serveur, une fois que le job sera lancé et terminé, je souhaite envoyer un message au client. A ce niveau, pas de problèmes.

    C'est coté client que j'ai des soucis, comment INTERCEPTER le message ?

    Je rappelle que je peux intercepter des messages quand le client envoi un message au serveur et que celui-ci lui répond immédiatement.

    Là mon problème est typiquement de CATCHER le message provenant du serveur sans que le client est envoyé de message au serveur ?

    Mon objectif est de rafraichir des infos coté client, à la demande du serveur

    Hier, j'ai planché toute la journée, et une solution super bourrin que j'ai mis en place coté client est une procédure qui se lance dans un THREAD toutes les secondes pour aller LIRE ce que je reçois du serveur.

    résultats : mon appli coté cliente est super ralenti, et certains messages n'ont pas été interceptés.

    De plus, cette solution n'est pas satisfaisante. Car je peux très bien ne pas recevoir de messages du serveur pendant toute une journée, et pour une autre journée, en recevoir 10 (enfin c'est un exemple)

    Donc, c'est vraiment le message envoyé par le serveur qui doit déclencher le rafraichissement coté client.

    J'ai vu dans la doc hier qu'il existait la propriété INTERCEPT pour le composant IdTCPClient, mais à vrai dire, je n'ai pas réussi à comprendre son fonctionnement.

    Kk'un a t-il une idée sur le problème ?
    Au passage, un GRAND BRAVO à REISUBAR pour ses exemples dans la FAQ sur INDY et les sockets , super boulot !!!

    @

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    C'est assez simple en fait : tu crées un thread qui va lire ce que tu attends du serveur. Ce thread va bloquer pendant tout le temps que le serveur traite ton job, mais comme c'est un thread, ça ne pose pas de problème.
    En plus, les composants Indy sont prévus pour être threadés sans bavure

  3. #3
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par sjrd
    C'est assez simple en fait : tu crées un thread qui va lire ce que tu attends du serveur. Ce thread va bloquer pendant tout le temps que le serveur traite ton job, mais comme c'est un thread, ça ne pose pas de problème.
    En plus, les composants Indy sont prévus pour être threadés sans bavure
    Bonjour sjrd,

    Merci de ta réponse, mais cela ne correspond pas à mon besoin.

    Je ré-explique (j'ai pas été très explicite apparemment)

    le client paramètre un job, celui-ci est envoyé au serveur par message.
    le serveur reçoit, il répond au client qu'il a bien reçu, il place le job dans une file d'attente, donc le job n'est pas lancé de suite.
    le client peut poursuivre son activité, il n'attend pas de réponses du serveur.

    Coté serveur, j'examine l'état de ma file d'attente, et je lance le job quand je l'ai décidé (nombres de processus en cours, priorité du job).

    Nota : un job est lancé coté serveur dans un thread avec un identifiant de job (j'ai stocké dans une bdd au préalable les infos sur le job (utilisateur, adresse IP du client, paramètrage,...).

    Le serveur lance et termine le job. Je souhaite envoyer au client (par son adresse IP), un message.

    Coté client, je souhaite INTERCEPTER ce message, et lancer un rafraichissement d'un certain nombre d'informations (liste des jobs en attente, en cours, terminé, liste des connectés,...).
    Ces infos sont dispos dans une BDD. Ce n'est pas le serveur qui doit me les envoyer. Je veux juste INTERCEPTER un message comme 'REFRESH' pour lancer une procédure coté client.

    J'espère que je suis plus clair.

    merci de ton aide

    @

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Perso je vois deux solutions :
    • Ou tu intègre un serveur à ton client et un client à ton serveur
    • Ou tu fais ton refresh dans un timer

  5. #5
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par sjrd
    Perso je vois deux solutions :
    • Ou tu intègre un serveur à ton client et un client à ton serveur
    • Ou tu fais ton refresh dans un timer
    re-bonjour sjrd,

    1/ je comprends pas trop ce ke tu veux dire par là pourrais tu m'expliquer un peu plus ta solution ?

    2/ solution du refresh dans un timer pas très performante, c'est ce ke j'ai tenté en vain hier (cf début du post)

    Pourtant, il existe une propriété INTERCEPT au niveau des composants INDY TCP, on doit pouvoir s'en servir !!

    mais à vrai dire l'aide n'est pas d'un grand secours

    merci encore de ton aide (je tourne un peu en rond)

    @

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    Si j'ai compris ce que sjrd a voulu dire par :
    "tu intègre un serveur à ton client et un client à ton serveur "

    Le truc, c que tu sais tres facilement envoyer un message au IdTCPServer depuis un IdTCPClient.
    Donc pour passer un message de ton Application serveur a ton Application cliente, pose un idTCPServer dans ton client, et a l'aide d'un IdTCPclient posé dans ton serveur, connecte le client de l'application serveur, au serveur de l'application client, envois le message, et deconnecte cette connection.


    Sisi, c'est tres clair.
    Aussi confu que ca puisse peut etre parraitre, ca marche tres bien, mais avec un grand nombre de clients, tu perds un temps non negligeable.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    pour ta réponse, elle est très claire, je vais tester cela.


    @

Discussions similaires

  1. [MFC][Visual .net] Intercepter les messages
    Par ptitesouris dans le forum MFC
    Réponses: 1
    Dernier message: 31/08/2006, 16h44
  2. intercepter les messages clavier dans un CDialog
    Par firejocker dans le forum MFC
    Réponses: 3
    Dernier message: 26/12/2005, 11h14
  3. Intercepter les messages windows
    Par schneed dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/12/2005, 14h12
  4. Intercepter les messages émis par WordApplication
    Par Claude Animo dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 11/07/2005, 20h23
  5. Réponses: 2
    Dernier message: 06/04/2004, 08h39

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