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 :

Problème socket server/client


Sujet :

Web & réseau Delphi

  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut Problème socket server/client
    bonjour;
    je suis sous delphi 7 ,
    jai une aplication de partger des donneés en connectent avec winsock
    server/client , mon probleme c'est que les donnée partager sont envoyer a tous les client connecter le temp que moi je veux que lorsque un client demande une doneé il resoit la repence seule pas tous les clients, voici un petit chema
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    clien1-->server--->client1
    client2-->sever--->client2
    et non client1--->server--->client1+client2
    jai cherhcer dans pas mal de source mai tous étulise le 2eme methode
    jetulise tserversocket et tclientsocket ;
    desole pour lortographe et merci pour votre aide

  2. #2
    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
    cool tu as inventé une alternative au multicast

    ce comportement n'a lieu qu'avec un réseau multicast ou si ton serveur envoie la réponse à chaque client...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    cool tu as inventé une alternative au multicast

    ce comportement n'a lieu qu'avec un réseau multicast ou si ton serveur envoie la réponse à chaque client...
    merci pour la repence;
    cest ca le serveur envoie la repence a chaque client un par un dans un intervale de mili seconds suposent que en a 4 clients chez mon serveur
    la procedure ce fait :
    client1 envoi une demande --serveur repend client1
    client3 envoi un autre demande --serveure repend client 3

  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
    si le serveur envoie une réponse sur le socket de client1, client2 ne peux pas la recevoir !
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    si le serveur envoie une réponse sur le socket de client1, client2 ne peux pas la recevoir !
    oui cet ca la repence doit etre envoi a ce qui a envoyer la demande

  6. #6
    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
    tu as réglé ton problème ? j'aimerais bien t'aider, mais je n'ai pas trop compris ce que tu cherches à faire et sur quoi tu bloques ...

  7. #7
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    Citation Envoyé par Coussati Voir le message
    tu as réglé ton problème ? j'aimerais bien t'aider, mais je n'ai pas trop compris ce que tu cherches à faire et sur quoi tu bloques ...
    merci cher ami ,
    non jen ai pas encor regler mon probleme , jai essai pas mal de truc mai ca fonctionne toujour pas,
    jai essai avec un index de client mai le probleme c'est que lindex retourne le dernier client connecter et ne pas le dernier client qui a envoyer le demande.

  8. #8
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    voici mon code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (server.Socket.ActiveConnections > 0) then
    begin
    for i := 0 to server.Socket.ActiveConnections-1 do
    begin
    server.Socket.Connections[i].sendtext(data);
     
    end;
    le probleme ici c'est que [i] index le deriner client connecter et non le dernier client qui a envoyer une donnée.

  9. #9
    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 yazidou27 Voir le message
    voici mon code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (server.Socket.ActiveConnections > 0) then
    begin
    for i := 0 to server.Socket.ActiveConnections-1 do
    begin
    server.Socket.Connections[i].sendtext(data);
     
    end;
    le probleme ici c'est que [i] index le deriner client connecter et non le dernier client qui a envoyer une donnée.
    non ton code envoie exactement data à TOUS les clients !

    c'est une boucle sur la liste des connections actives
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  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
    je n'ai toujours pas bien compris ce que tu veux faire, mais si c'est envoyé un message au client qui sollicite le serveur, tu dois utiliser la méthode suivante :

    pour chaque client connecté, une constante (unique) est généré

    je ne l'a connais pas bien pour ces compo, mais essais : Socket.LocalPort, Socket.RemotePort ou au pire l'adresse ip du client (elle est censé être unique )

    et lorsque tu fais ta boucle, tu places la condition de répondre le client dont la constante est égale à la constante des clients que ta boucle parcours

    j'espère t'avoir aidé

  11. #11
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    pour chaque client connecté, une constante (unique) est généré

    essais : Socket.LocalPort, Socket.RemotePort ou au pire l'adresse ip du client (elle est censé être unique )

    et lorsque tu fais ta boucle, tu places la condition de répondre le client dont la constante est égale à la constante des clients que ta boucle parcours

    j'espère t'avoir aidé
    merci boucoup cher ami, mai le probleme que je pose c'est que activeconnection index le dernier client qui conect alor meme si je mit la condition elle sera toujour vré mai le serveur repend que a le client qui conecte le dernier et non qui a envoyer la derniere demande de traitment.

  12. #12
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut mon source
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    var
      Form1: TForm1;
      client:integer;
      index:integer;
    implementation
     
    {$R *.dfm}
     
       function StringtoHex(Data: string): string;
    var
      i, i2: Integer;
      s: string;
    begin
      i2 := 1;
      for i := 1 to Length(Data) do
      begin
        Inc(i2);
        if i2 = 2 then
        begin
          s  := s + ' ';
          i2 := 1;
        end;
        s := s + IntToHex(Ord(Data[i]), 2);
      end;
      Result := s;
    end;
     
    procedure TForm1.opcomClick(Sender: TObject);
     
    begin
    comport1.Port:=com.Text;
    comport1.Connected:=not comport1.Connected;
    comport1.Connected:=true;
     
     
    end;
     
    procedure TForm1.ComPort1AfterOpen(Sender: TObject);
    begin
    opcom.Enabled:=false
    end;
     
    procedure TForm1.ComPort1AfterClose(Sender: TObject);
    begin
    opcom.Enabled:=true;
    end;
     
    procedure TForm1.opserverClick(Sender: TObject);
    begin
     
    server.Port:=strtoint(port.Text);
    server.Open;
    etat.caption:='server open';
    etat.font.Color:=clgreen;
     
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    comport1.Close;
    end;
     
    procedure TForm1.serverAccept(Sender: TObject; Socket: TCustomWinSocket);
    begin
     
       list.Lines.Add('accept:'+socket.RemoteAddress) ;
       client:=client+1;
       num.Caption:=inttostr(client);
     
     
    end;
     
    procedure TForm1.serverClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      list.Lines.Add('close:'+socket.RemoteAddress);
      client:=client-1;
      num.Caption:=inttostr(client);
    end;
     ////////////
     
     
     
    procedure TForm1.serverClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var  recudata:string;
    begin
     
     if (server.Socket.ActiveConnections > 0) then
    begin
    index :=  (server.Socket.ActiveConnections-1) ;
    begin
    recudata:=server.Socket.Connections[index].ReceiveText;
     
    end;
    comport1.WriteStr(recudata) ;
     
     
    end;
     
    end;
     
    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    var  data, chaine:string;// le traitment de la demande se fait ici dans un dongle conectet via portCom
    begin
       comport1.ReadStr(chaine,count);
        data:=chaine;
     
       if (server.Socket.ActiveConnections > 0) then
    begin
    index := (server.Socket.ActiveConnections-1 );
     
    server.Socket.Connections[index].sendtext(data);
     
    end;
    end ;

  13. #13
    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
    pourquoi prends-tu "server.Socket.ActiveConnections-1" qui est le dernier client connecté et pas forcément celui qui envoie des données

    le paramètre Socket de la fonction n'est-il pas tout simplement le socket client concerné ?!
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    pourquoi prends-tu "server.Socket.ActiveConnections-1" qui est le dernier client connecté et pas forcément celui qui envoie des données

    le paramètre Socket de la fonction n'est-il pas tout simplement le socket client concerné ?!
    j'abondone jai trop chercher mai pas de soulution ,jai trouver une source de chat qui gere la repence priver mai ca fonctionne trj pas avec moi
    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
    procedure TMsgPerso.BitBtnEnvoyermsgPriveClick(Sender: TObject);
    var
       MessagePrive : string;
       i : integer;
    begin
       if LabeledEdit1.Text <> '' then
       begin
          if ServeurActif = TRUE then
          begin
            MessagePrive := 'MsgPrive'+'#DE#'+'Serveur'+'#POUR#'+TrouverNomLoginQuiRecoitMsg+'#CORPS#'+LabeledEdit1.Text+'#FIN#';
            ChatRL.MemoActivite.Lines.Add('Message Privé du '+'Serveur'+' pour '+TrouverNomLoginQuiRecoitMsg+' >>  '+LabeledEdit1.Text);
            for i:=0 to NumeroArriveConnexion-1 do
            begin
              ChatRL.ServerSocket.Socket.Connections[i].SendText(#13+MessagePrive);
            end;
          end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TChatRL.ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
         //Showmessage('le client est connecté : '+Socket.RemoteHost);
         inc(NumeroArriveConnexion);
         TimerInformationsChateur.Enabled := TRUE;
    end;
    jai fait le meme code mai sur mon apli le serveure envoi a le dernier connecter sur la liste.

  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
    forcément, le principe d'un chat c'est que tout le monde reçoit les messages de tout le monde

    tu as la réponse à ton problème dans les messages précédents.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    forcément, le principe d'un chat c'est que tout le monde reçoit les messages de tout le monde

    tu as la réponse à ton problème dans les messages précédents.
    oui je cai mai mon code nest pour un chat ,
    votre precedente repence donne une erreure .

  17. #17
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut thread
    jai toujour pas resolu mon probleme ,
    jai trouver quelque ideés mes je narrive pas a les traduire en code;
    jai trouver que en peu étuliser les thred pour chaque client comme ca en fait les traitment separement ,
    mai jarrive pas a codé cela dont je suis nul ; dans les composont tserversocket ya les evenement engetcleitThred , en StartThread, en endThred.. mai comment les etuliser??

  18. #18
    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'aimerais bien t'aider, mais pour être honette, j'ai essayé, et je ne comprends pas vraiment ce que tu veux faire

  19. #19
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 43
    Par défaut
    Citation Envoyé par Coussati Voir le message
    j'aimerais bien t'aider, mais pour être honette, j'ai essayé, et je ne comprends pas vraiment ce que tu veux faire
    voila un chema

Discussions similaires

  1. [C/C++]Socket Server/Client
    Par X-K4l1 dans le forum Développement
    Réponses: 5
    Dernier message: 03/12/2013, 13h08
  2. Réponses: 4
    Dernier message: 09/04/2010, 11h42
  3. Problème communication serveur/client avec Socket
    Par Nicolas74 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 03/12/2009, 17h54
  4. [Débutant][Sockets] Server en C++, client en Java
    Par mavina dans le forum Réseau
    Réponses: 16
    Dernier message: 05/10/2009, 04h45
  5. Socket - Problème de communication client/serveur
    Par Arkinou dans le forum Réseau
    Réponses: 4
    Dernier message: 31/05/2007, 16h01

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