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

C++Builder Discussion :

Réponse d'un serveur à plusieurs clients


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 18
    Points
    18
    Par défaut Réponse d'un serveur à plusieurs clients
    Bonjour,
    j'ai crée une application client/serveur. Le serveur accepte la connexion de plusieurs clients sans problème.
    Par contre j'aimerais que lorsque je reçois une requête d'un client, le serveur réponde à l'ensemble de clients connectés et pas seulement à l'emetteur de la requête. C'est possible ? Merci.

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Quels composant utilise tu ?
    Si c'est des composants TServerSocket et TClientSocket, la solution est la suivante :
    Dans l'evenement OnClientRead du composant TServerSocket tu met ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i ;
    AnsiString texte = Socket->ReceiveText() ;
    for(i=0;i<ServerSocket1->Socket->ActiveConnections;i++){
      ServerSocket1->Socket->Connections[i]->SendText("Le texte à envoyer") ;
    }
    Voila
    A plus
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup de ta réponse.

    Le principe recherché :
    Le client demande à jouer un son à l'appui d'une touche.
    Le serveur récupère le nom du fichier à jouer et l'envoi à tous les clients afin qu'ils lancent la lecture de ce son.

    J'ai testé le code que tu m'a donné.
    Maintenant quand j'appuis sur une touche, il n'y a qu'un pc qui joue les sons même quand on les demande d'un autre pc. Il ne doit surement pas manquer grand chose pour que la lecture se fasse en simultané sur tous les clients...

    Code serveur - méthode de réception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     AnsiString recept;
            int i ;
     
            recept = Socket->ReceiveText();
            StatusBar1->SimpleText = "Requête cliente reçue";
            Memo1->Lines->Add(recept);
     
            for(i=0; i<ServerSocket1->Socket->ActiveConnections; i++)
            {
                    ServerSocket1->Socket->Connections[i]->SendText(recept);
            }
    COde client - méthode de réception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AnsiString recept;
            recept = Socket->ReceiveText();
     
            if (recept == "excellent")
                    PlaySound("Audio\\excellent.wav", NULL, SND_SYNC);
            if (recept == "benny")
                    PlaySound("Audio\\benny.wav", NULL, SND_SYNC);
    Normalement avec ton code, le nom du wav est envoyé à chaque client puis lu. Mais ça n'a pas l'air de marcher puisque la lecture ne se fait que chez un client.

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour
    il n'est pas nécessaire d'utiliser la propriété connection pour recevoir et répondre a des requètes sur les socket
    je joins un exemple pour t'en convaincre
    cordialement
    Fichiers attachés Fichiers attachés
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Citation Envoyé par Reven777
    Merci beaucoup de ta réponse.

    Le principe recherché :
    Le client demande à jouer un son à l'appui d'une touche.
    Le serveur récupère le nom du fichier à jouer et l'envoi à tous les clients afin qu'ils lancent la lecture de ce son.

    J'ai testé le code que tu m'a donné.
    Maintenant quand j'appuis sur une touche, il n'y a qu'un pc qui joue les sons même quand on les demande d'un autre pc. Il ne doit surement pas manquer grand chose pour que la lecture se fasse en simultané sur tous les clients...

    Code serveur - méthode de réception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     AnsiString recept;
            int i ;
     
            recept = Socket->ReceiveText();
            StatusBar1->SimpleText = "Requête cliente reçue";
            Memo1->Lines->Add(recept);
     
            for(i=0; i<ServerSocket1->Socket->ActiveConnections; i++)
            {
                    ServerSocket1->Socket->Connections[i]->SendText(recept);
            }
    COde client - méthode de réception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AnsiString recept;
            recept = Socket->ReceiveText();
     
            if (recept == "excellent")
                    PlaySound("Audio\\excellent.wav", NULL, SND_SYNC);
            if (recept == "benny")
                    PlaySound("Audio\\benny.wav", NULL, SND_SYNC);
    Normalement avec ton code, le nom du wav est envoyé à chaque client puis lu. Mais ça n'a pas l'air de marcher puisque la lecture ne se fait que chez un client.
    Essaye de mettre plusieurs client en débugage pour voir si ils recoive bien la trame du serveur ou non, si tu ne peut pas, alors met un TLabel sur ta Form et affiche toute les requetes recu par le client dedans, comme ca tu vera si il recoit bien la trame ou non.
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Je test le débug demain, merki.

    Tous mes clients reçoivent bien la réponse du serveur (c'est déjà ça).
    Mais... il n'y a qu'un client qui joue le fichier son !
    Est-ce dû à une mauvaise utilisation de la fonction PlaySound() ??
    A quoi correspondent les paramètres de la fonction SND_SYNC, SND_ASYNC, SND_NOSTOP, etc... ?? J'ai laissé par défaut, SND_SYNC.
    Merci.

  7. #7
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    A tu bien les fichiers son sur chaque postes?
    Si tes fichier son sont enregistré dans le répertoire Audio, qui lui se trouve dans le même repertoire que ton .exe alors il faut mettre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PlaySound(Application->ExeName + "\\..\\audio\\nomDuFichierWav.wav",NULL, SND_SYNC);
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Oui les wav sont bien au même endroit dans tous les cas. J'ai crée un installer qui les place automatiquement.
    Ils sont dans le répertoire Audio situé au même niveau que mon exécutable.
    J'ai testé le lien que tu m'a donné, ça ne marche pas.
    La lecture fonctionne bien avec le chemin que j'avais mis.

    Ca y est, tout marche nikel !!!
    J'ai juste modifié SND_SYNC en SND_ASYNC.
    Je pense qu'avant tant que le son n'était pas joué on avait pas la main sur l'application et ça empechait l'autre son d'être joué.
    Maintenant plus de problèmes, on observe un léger décalage dû à la transmission mais sinon c'est GOOD !

    Merci pour l'aide.

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

Discussions similaires

  1. un serveur /plusieurs clients
    Par Bathou dans le forum Réseau
    Réponses: 43
    Dernier message: 20/11/2012, 17h37
  2. réponse d'un serveur à un client
    Par GerardJ dans le forum Web & réseau
    Réponses: 3
    Dernier message: 11/11/2008, 14h21
  3. Script serveur , plusieurs clients
    Par youcef81 dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 06/11/2007, 15h04
  4. Réponses: 72
    Dernier message: 05/12/2005, 10h45
  5. Plusieurs clients et un serveur
    Par mzt.insat dans le forum Développement
    Réponses: 2
    Dernier message: 13/10/2005, 15h01

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