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 :

[TCP IP] Demande-réponse serveur


Sujet :

Web & réseau Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [TCP IP] Demande-réponse serveur
    Bonjour,

    j'ai une petit application client-server par TCP/IP (comme le chat).
    Voici l'extrait d'une partie du serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    VAR
        Str1:    String;
    BEGIN
        Str1:=AThread.Connection.Readln;
        If Str1 = '#Question' then
             AThread.Connection.WriteLn('#Reponse');
        ...
    END;
    et voici le client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TMainForm.QuestionButtonClick(Sender: TObject);
    VAR
        Str1:    String;
    BEGIN
        ServerConnection.WriteLn('#Question');
        Str1 := ServerConnection.ReadLn('#');
    END;
    Le problème c'est, que ça marche pas toujours. En générale le client attente, sans aucun réponse. Comment recevoir la réponse du serveur, tout en gardant la connection ouvert?
    Merci pour vos conseilles...

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 548
    Points : 25 118
    Points
    25 118
    Par défaut
    J'aurais tendance à penser qu'il soit nécessaire d'envoyer 'Question#' et 'Reponse#' puisque tu définie '#' comme la fin de ligne (ce que tu as confondu avec un début de ligne), laisse ReadLn utilisé par défaut le caracter EOL (CR+LF) qu'ajoute naturellement WriteLn !

    ou simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    VAR
        Str1:    String;
    BEGIN
        Str1:=AThread.Connection.Readln();
        If Str1 = 'Question' then
             AThread.Connection.WriteLn('Reponse');
        ...
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TMainForm.QuestionButtonClick(Sender: TObject);
    VAR
        Str1:    String;
    BEGIN
        ServerConnection.WriteLn('Question');
        Str1 := ServerConnection.ReadLn();
    END;
    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 expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Cherches TCP sur le forum avec auteur waskol.
    J'ai dû exposer en long en large en travers ce problême d'implémentation des sockets (c'est un des bugs du standard Berkeley, et il y en a un autre).

    J'ai du fournir à plusieurs reprises un lots de composants (attention, c'est du socket bloquant) qui gèrent ces problêmes, et ils sont tout simples à utiliser.

    En gros, le truc, c'est qu'il y a un délais à l'envoi des données d'un socket.
    Si tu envois tout au plus quelques octets, ça reste en tampon... jusqu'au moment où tu envois un 2eme paquet, et là... ton client récupère et le premier et le deuxième envoi !!!

    Et il me semble que celà fait aussi la même chose avec un gros envoi qui arrive en deux fois chez le client.

    Du coup, pour palier à ça, il faut envoyer ton message en lui ajoutant en tête, la taille de ce qui est envoyé, comme ça, à la réception, le client est "prévenu" de ce qu'il doit recevoir (la taille), et recompose son message en fonction des paquets qu'il reçoit au fur et à mesure.

    C'est nul, mais c'est comme ça.

    Enfin, bref, te voilà prévenu et cherches sur le forum.
    Bidouilleuse Delphi

Discussions similaires

  1. Pas de réponse serveur IHS
    Par RicFT dans le forum Apache
    Réponses: 3
    Dernier message: 05/12/2007, 14h09
  2. [AJAX] AJAX et gestion des réponses serveur
    Par eolis dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/09/2007, 17h04
  3. XMLHTTP : réponse serveur
    Par Tsukaniki dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/08/2007, 02h31
  4. [XML] [XML-RPC] retrouver les infos d'une réponse serveur
    Par arnolem dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/08/2006, 12h07

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