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 :

[D7] Comment feriez-vous une messagerie instantanée façon MSN ?


Sujet :

Web & réseau Delphi

  1. #21
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Anapurna,

    Pour ce qui est du tchat, oui, je travaille avec cet exemple. Je peux même mettre en pièce jointe le code si tu le souhaites.
    Je débute en programmation "réseau" et j'ai besoin de conseils, pistes voir exemple pour que je puisse faire dialoguer dans un premier tant mon client 1 avec mon serveur et ensuite, faire parler mon client 2 avec le client 1 tout en passant pas la case serveur.

    Donc voilà, je me tourne vers vous pour que vous puissiez m'aider si vous le pouvez et si vous le voulez

    Merci

  2. #22
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    marche tres bien le mini tchat il te faut quoi de plus ?

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #23
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Oui, je sais que le mini chat fonctionne bien, mais j'essaie de faire le mien car copier bêtement ça m'aide pas trop ... Je ne vois pas ce qu'il cloche dans le code que j'ai posté précédemment .

    J'ai étudier le code du TWSChat.pas et du TcpSrv1.pas mais rien n'y fait, je vois pas mon soucis

    Si tu le souhaites, je peux mettre à disposition ma source bien que le code est dans le post précédent

    Merci

  4. #24
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut


    le serveur n'as pas de methode connect

    pour la gestion des messages tous ce passe dans le tuser
    regarde la methode SocketDataAvailable

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #25
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    En fait, je m'y perd un peu car dans le code du TcpSrv1.pas, d'après ce que je comprends on redéfinit la méthode OnDataAvailable.
    Logiquement, c'est dans cet événement que les messages transitent.

    Du coté du serveur, j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Memo1.Text:=SocketServeur.ReceiveStr;
    Je me demande si cette ligne de code est juste. En plus plus je lis les codes sources, plus je m'embrouille et plus je fait n'importe quoi

    Pour ce qui est du connect du coté serveur, en effet, il n'y a pas, j'avais pas fait attention! Merci déjà pour ce premier élément

    Apparemment je viens de comprendre un petit truc mais bon, j'aimerai avoir des explications du pourquoi si possible.

    J'ai fait comme dans le tchat, redéfinit la méthode du OnDataAvailable du client, ce qui donne en gros ceci comme code coté serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.ClientDataAvailable(Sender : TObject; Error  : Word);
    begin
        with Sender as TWSocketClient do begin
          Memo1.Lines.Add(ReceiveStr);
        end;
    end;
     
    procedure TForm1.SocketServeurClientConnect(Sender: TObject;
      Client: TWSocketClient; Error: Word);
    begin
      //serveurClient:=TWSocketServer.Create(Self);
      Memo1.Lines.Add(Client.SocksUsercode+' vient de se connecter');
      Client.OnDataAvailable:=ClientDataAvailable;
    end;
    Le serveur reçoit les messages, mais par contre, je n'arrive pas à accéder au SocksUserCode à la connexion du client )

    Enfin voilà, je pense avoir tout dit! Si quelqu'un qui s'y connait avec ces composants peu m'expliquer pourquoi on doit redéfinir la méthode du client et pourquoi ça ne fonctionne pas dans le OnDataAvailable du serveur.

    Merci

  6. #26
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    cet ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client.OnDataAvailable:=ClientDataAvailable;
    permet de transmettre l'information dans les deux sens
    c'est un peut quant tu fait un double clik sur une grille tu a un evenement qui ce creer "dynamiquement"
    en fait si tu regarde de plus pres tu t'apercevrai que dans le dfm tu as une indication pour cette methode
    ce qui reviendrait a faire de facon "statique"
    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
     
    TMyForm = class(Tform)
      MaGrille : TStringGrid;
      Procedure FormCreate(sender : tobject);
    ...
     procedure OnDblClickGrille(sender : tobject);
     
    end;
    ...
      Procedure TMyForm.FormCreate(sender : tobject);
      begin
        MaGrille.OnDblClick := OnDblClickGrille;
      end;
     procedure TMyForm.OnDblClickGrille(sender : tobject);
     begin
     end;
    je me sert assez souvent de cette methode pour faire remonter les information de traitement sur mon affichage

    d'ailleur si tu regarde le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TfrmMain.sktMainClientConnect(Sender: TObject; Client: TWSocketClient; Error: Word);
    var
      User: TUser;
    begin
      User := TUser(Client); // ici tu specialise ta "WSocketClient"
     
      with User do begin
         OnDataAvailable := SocketDataAvailable; // on affecte pour faire remonter l'info et pouvoir travailler dessus
         ...
      end;
    ...
    end;
    pour je pense que celui-ci n'est renseigne qu'apres connection avec le serveur
    et pas au momment de sa connection

    @+Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #27
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Anapurna

    Je suis entièrement d'accord avec toi sur le fait de la façon de traiter l'info... Je le fait d'ailleurs de plus en plus souvent.

    Si je comprends bien, lors de la connexion au serveur, dans l'événément OnClientConnect, on récupère le client avec lequel on veut travailler puis, on rédéfini sa méthode OnDataAvailable pour pourvoir récupérer les infos qu'il envoie et également lui en envoyer.

    Aussi, pourquoi on ne peut pas utiliser le OnDataAvailable du serveur, vu que c'est lui qui récupère tous les messages qui transitent ?

    Merci de ton aide Anapurna

  8. #28
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut


    Si je comprends bien, lors de la connexion au serveur, dans l'événément OnClientConnect, on récupère le client avec lequel on veut travailler puis, on rédéfini sa méthode OnDataAvailable pour pourvoir récupérer les infos qu'il envoie et également lui en envoyer.
    en gros oui c'est a cette endroit que l'on connect le client

    Aussi, pourquoi on ne peut pas utiliser le OnDataAvailable du serveur, vu que c'est lui qui récupère tous les messages qui transitent ?
    pour un raison simple le serveur sert a mettre en relation les client entre eux

    mais rien ne t'empeche d'essayer assigne le OnDataAvailable du serveur et regarde ce qui passe dedans

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  9. #29
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ok, je comprends un peu mieux maintenant la démarche pour qu'un serveur reçoive les données !

    Maintenant, si je veux mettre en relation 2 clients tout en passant pas le serveur je dois :

    1) Identifier le client qui envoie la requête
    2) Identifier le client destinataire
    3) Dire au serveur que le paquet de données envoyé va du client 1 vers le client 2

    Peux tu m'en dire un peu plus sur la façon dont je dois procéder pour que le client 1 parle au client 2.
    Bien entendu après chaque client devra être capable de parler avec les clients qu'il souhaite... donc avoir plusieurs connexions pour plusieurs clients.

    Si je reprends un peu le fils du post, il me faut créer autant de socket serveur que de client connecté. Après, du coté client, pour chaque "canal de discussion" vers un client, je dois aussi créer des sockets ?

    Merci de ton aide et excuse moi pour ces questions qui, certainement, te semble un peu absurde...

  10. #30
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    ah bin non tu n'as pas tout compris

    le serveur gère les trame(donnée) et les redistribue sur les clients
    le serveur centralise et redistribue selon la demande
    soit a tout les client connecte soit a un client défini

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #31
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Citation Envoyé par anapurna
    ah bin non tu n'as pas tout compris
    Ah, c'est pas grave, je suis là pour cela!

    Je vais sûrement être un peu embêtant là ...
    Ce n'est pas dans mes habitudes de demander ce genre de choses, ça serait même la première fois d'après moi, mais est-ce que tu pourrais (si tu as le temps et si tu veux bien), me faire un petit exemple de programme pour que je puisse étudier le code de mon coté, et voir par la suite pour poser les questions sur le forum.
    Le programme n'est pas un projet professionnel ou autre, c'est juste que j'ai envie de bien cerner le fonctionnement (ce qui n'est pas le cas du tout apparemment).
    En fait, ce serait bien genre un serveur et 3 clients.
    Et faire en sorte que le client 1 discute avec le client 2 pour voir comment redistribuer les packets au bon destinataire.

    Honnêtement, cela m'aiderai beaucoup, et ce n'est pas dans mes habitudes du tout de demander du code

    Je te remercie d'avance
    Cordialement

  12. #32
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par ero-sennin
    faire en sorte que le client 1 discute avec le client 2 pour voir comment redistribuer les packets au bon destinataire.
    C'est le client n°1 (expéditeur) qui ordonne au serveur que le message est pour le client 2, le serveur ne fait que redistribuer les données, il ne décide rien à ce niveau. Par exemple, dans le message qu'envoi le client 1, il y aura le numéro, ID, IP ou pseudo du client destinataire.

    Le serveur fait l'intermédiaire, il reçoit ce message, récupère dedans l'ID du destinataire et le renvoi au client spécifié. C'est au développeur de mettre au point ce protocol, enfin je crois... par exemple, les 3 premiers caractères du message correspondent au numéro du client destinataire...
    De retour parmis vous après 10 ans!!

  13. #33
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    as tu regardé les source du minitchat fait avec ics et as tu reussi a le faire fonctionné

    il suffit de lancer le serveur et ensuite de d'executer deux client
    en demandant la liste des client il t'est possible de choisir le client avec lequel tu veut discuter
    je ferait sans dout pas mieux que cet exemple

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  14. #34
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    D'abord merci pour les explications (une fois de plus).

    Pour ce qui est du Tchat de ICS, j'espère que nous parlons bien de la même démonstration (TWSChat.pas).

    J'ai fait un petit test, et il s'avère que le serveur n'accepte qu'un client et que ce dernier peut communiquer avec le serveur.

    Je pense prendre un peu de recul avec tout ca, car à force de me plonger dedans, au lieu d'y voir plus clair, j'y vois de moins en moins clair.

    Je laisse le post ouvert et bien entendu, si vous avez des exemples ou explications à fournir, je les lirai et les testerai sans soucis.

    A+

  15. #35
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    bin non je ne croit pas que l'on parle de la meme chose
    recherche dans le menu Produit utilisateur ensuite fait une recherche sur MINICHAT.ZIP de Steve Williams


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #36
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ah, oui, je viens d'aller voir sur le site et je viens de trouver le tout !

    Je vais essayer de décortiquer le code et voir ce que je peux faire avec tout ça

    Merci bien Anapurna

  17. #37
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Je viens ici poster un petit soucis que j'ai.
    J'ai étudié le tchat qui provient du site Overbyte (merci à Anapurna car j'avais pas vu cette démo qui est très utile).
    Mon client et mon serveur sont bien connecté.
    A la connection, le serveur récupère l'IP du Client (dans mon cas identique au serveur pour les tests).
    Lorsque j'envoie un message au serveur et que je demande de l'afficher, ça ne fonctionne pas... du moins pas tant que le client reste ouvert.
    En effet, c'est lorsque je ferme le client que je serveur reçoit mes messages.

    Je ne sais pas d'où peut provenir l'erreur.
    Je vous post le code coté serveur et client afin qui vous puissiez m'éclairer sur ce petit soucis.

    Coté Client :
    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
    procedure TForm1.BtnConnexionClick(Sender: TObject);
    begin
     SocketClient.Addr:='192.168.1.2';
     SocketClient.Port:='34598';
     SocketClient.Connect;
    end;
     
    procedure TForm1.BtnDeconnexionClick(Sender: TObject);
    begin
      SocketClient.Close;
    end;
     
    procedure TForm1.BtnEnvoieMessageClick(Sender: TObject);
    begin
      Socket
    Client.SendStr(MessageAEnvoyer.Text);
    end;

    Coté Serveur :
    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
    type
      TUser = class(TWSocketClient)
      public
        AdresseIP:String;
        Pseudo:String;
        ConnectTime : TDateTime;
        procedure SocketDataAvailable(Sender: TObject; Error: Word);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TUser.SocketDataAvailable(Sender: TObject; Error: Word);
    begin
      Form1.ListBox1.Items.Add(ReceiveStr);
    end;
     
    procedure TForm1.SocketServeurClientConnect(Sender: TObject;
      Client: TWSocketClient; Error: Word);
      var
      User:TUser;
    begin
      User:=TUser(Client);
      With User do
      begin
      OnDataAvailable:=SocketDataAvailable;
      LineMode:=true;
      LineEnd  := #13#10;
      end;
     
      with ListBox1.Items do
      begin
        Add(User.PeerAddr);
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SocketServeur.Addr:='0.0.0.0';
      SocketServeur.Port:='34598';
      SocketServeur.ClientClass:=TUser;
      SocketServeur.Listen;
    end;
    J'espère que vous pourrez m'aider
    Cordialement

    EDIT

    Bon, j'ai trouvé ce qui n'allait pas! Après quelques relectures encore et encore, j'ai fini par voir qu'il ne fallait pas utiliser LineMode ni LineEdit si je n'ai pas déterminé de caractère de fin de ligne
    Je continue sur ma lancé et vous tiendrez des éventuels problèmes!

    Que ça fait du bien d'avancer !!!

  18. #38
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bonsoir !

    Me revoilà avec mes soucis (hé oui ).

    Le problème que je rencontre actuellement, c'est au niveau des données qui transiste d'un serveur au client.
    Je m'explique :

    Lorsque le premier client se connecte au serveur, tout est ok.
    Le problème, c'est lorsque le seconde se connecte...
    Il envoie bien les infos mais gardes en mémoire (j'ai l'impression) les infos précédentes...

    Du genre ; Toto se connecte le premier, ça fonctionne correctement
    Mais si tata se connecte après, tata devrait recoit les clients un à un mais ce n'est pas le cas. Tata va recevoir un chaine du genre : Toto10-Tata

    Je vous mets mon code, si vous souhaitez le tester :

    Coté Serveur
    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
    type
     
      TUser = class(TWSocketClient)
      public
        procedure SocketDataAvailable(Sender: TObject; Error: Word);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TUser.SocketDataAvailable(Sender: TObject; Error: Word);
    var
      CodeMessage,i,j:Integer;
      MessageRecu,MessageEnvoye:String;
      Users:TUser;
    begin
      MessageRecu:=ReceiveStr;
      CodeMessage:=StrToInt(copy(MessageRecu,1,2));
      MessageRecu:=copy(MessageRecu,4,length(MessageRecu)-3);
      case CodeMessage of
      // Cas 10: On demande la liste des clients ...
      //2 cas : 1) On envoie toutes la liste au client qui vient juste de se connecter
      //        2) On envoie juste le dernier client connecté aux autres clients déjà en ligne
      10:begin
           Form1.ListBox1.Items.Add(MessageRecu);
           MessageRecu:='';
           for i:=0 to Form1.SocketServeur.ClientCount-1 do
           begin
             Users:=TUser(Form1.SocketServeur.Client[i]);
             // Envoie de la liste des clients au nouveau connecté
             if Users=Self then
             begin
               for j:=0 to Form1.ListBox1.Items.Count-1 do
               begin
                 MessageEnvoye:=Form1.ListBox1.Items.Strings[j];
                 Users.SendStr('10-'+MessageEnvoye);
                 Users.ProcessMessages;
               end;
             end
             else
             // Envoie juste le client qui vient de se connecté au autre client connecté
             begin
               MessageEnvoye:=Form1.ListBox1.Items.Strings[Form1.ListBox1.Items.count-1];
               Users.SendStr('10-'+MessageEnvoye);
               Users.ProcessMessages;
             end;
           end;
         end;
      end;
    end;
     
    procedure TForm1.SocketServeurClientConnect(Sender: TObject;
      Client: TWSocketClient; Error: Word);
      var
      User:TUser;
    begin
      User:=TUser(Client);
      With User do
      begin
      OnDataAvailable:=SocketDataAvailable;
      LineMode            := FALSE;
      LineEdit            := FALSE;
      LineEnd  := #13#10;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SocketServeur.Addr:='0.0.0.0';
      SocketServeur.Port:='34598';
      SocketServeur.ClientClass:=TUser;
      SocketServeur.Listen;
    end;
    Coté client :

    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
    procedure TForm1.BtnConnexionClick(Sender: TObject);
    begin
     SocketClient.Addr:='192.168.1.2';
     SocketClient.Port:='34598';
     SocketClient.Connect;
    end;
     
    procedure TForm1.BtnDeconnexionClick(Sender: TObject);
    begin
      SocketClient.Close;
    end;
     
    procedure TForm1.BtnEnvoieMessageClick(Sender: TObject);
    begin
      SocketClient.SendStr(MessageAEnvoyer.Text);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      BtnConnexion.Enabled:=true;
      BtnDeconnexion.Enabled:=false;
      MessageAEnvoyer.Enabled:=false;
      BtnEnvoieMessage.Enabled:=false;
    end;
     
    procedure TForm1.SocketClientSessionConnected(Sender: TObject;
      ErrCode: Word);
    begin
      BtnConnexion.Enabled:=false;
      BtnDeconnexion.Enabled:=true;
      MessageAEnvoyer.Enabled:=true;
      BtnEnvoieMessage.Enabled:=true;
      // Envoie le pseudo au serveur afin d'avertir les autres clients
      SocketClient.SendStr('10-'+Edit1.Text);
    end;
     
    procedure TForm1.SocketClientDataAvailable(Sender: TObject; ErrCode: Word);
      var
      CodeMessage:Integer;
      MessageRecu:String;
    begin
      MessageRecu:='';
      MessageRecu:=SocketClient.ReceiveStr;
      CodeMessage:=StrToInt(copy(MessageRecu,1,2));
      MessageRecu:=copy(MessageRecu,4,length(MessageRecu)-3);
      ShowMessage(MessageRecu);
      case CodeMessage of
      // Cas 10: Ajout d'un ou de plusieurs clients ...
      10:Begin
         ListBox1.Items.Add(MessageRecu);
         end;
      end;
    end;
     
    procedure TForm1.SocketClientSessionClosed(Sender: TObject; ErrCode: Word);
    begin
      BtnConnexion.Enabled:=true;
      BtnDeconnexion.Enabled:=false;
      MessageAEnvoyer.Enabled:=false;
      BtnEnvoieMessage.Enabled:=false;
    end;
    Ci dessous, les sources pour ceux qui peuvent tester ...
    Merci de votre aide
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 21
    Dernier message: 30/04/2014, 19h17
  2. Réponses: 2
    Dernier message: 30/07/2009, 12h45
  3. Comment feriez-vous? conception d' une base de données.
    Par Patrick25300 dans le forum Schéma
    Réponses: 4
    Dernier message: 05/05/2008, 18h41
  4. [SQL] Comment feriez-vous cette requête pour une recherche ?
    Par Core8 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/02/2008, 11h58
  5. [Debug] Comment feriez-vous ?
    Par mandaillou dans le forum C++
    Réponses: 4
    Dernier message: 21/03/2007, 17h07

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