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 :

ScktComp, récupérer l'ID d'un client


Sujet :

Web & réseau Delphi

  1. #1
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut ScktComp, récupérer l'ID d'un client
    Bonjour,

    Je suis à la recherche d'un moyen de récupérer l'ID d'un client lors de sa connexion à mon serveur (afin de pouvoir lui envoyer du texte), est il possible de le faire dans l'event "OnClientConnect" ? Et comment ?
    Merci d'avance , bonne journée

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Qu'est ce que l'ID pour toi ?

    Le plus pratique c'est de conserver son SocketHandle à toi de voir si c'est au OnClientConnect ou OnClientRead

    Sur le OnClientConnect, je ne vois pas trop à quoi cela servirait, comment reconnaitre une connexion d'une autre
    Sur le OnClientRead, en gros tu réponds à celui qui a fourni une trame ou alors tu gères un système d'identification qui te permet de reconnaitre tel ou tel connecté

    Quel est ton projet ?
    Un Chat ? C'est le sujet à la mode ! Voir probleme connexion 1 serveur 2 clients ou Simple question IdTCP
    Un Truc plus intéressant ???

    Puis lors d'un envoie sur Connections[] de convertir le Handle en Index comme dans le sujet : Problème sur SocketHandle conflit d'identifiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function IndexHandle (ServerSocket : TServerSocket; Handle : Integer) : Integer ;
    var
        I : integer;
    begin
        // Verification de la connexion
        Result := -1 ;
        for I := ServerSocket.Socket.ActiveConnections - 1 downto 0 do begin
            if (Handle) = ServerSocket.Socket.Connections[i].SocketHandle then begin
                Result := I ;
                Break ;
            end;
        end;
    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 du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Et bien pour moi l'ID c'est ici la variable i: ServerSocket.Socket.Connections[i], en fait je dev actuellement un serveur multi client et un client en mode console, sur le serveur serra affiché sur la 1ère ligne, le 1er client avec son ID (1), et son IP, sur la 2ème ligne le 2ème client, etc etc

    pour le moment j'utilise une variable que j'auto incrémente quand un client se connecte, mais ça devient vite la catastrophe (quand un client se déconnecte par exemple, impossible de savoir lesquels est partis )
    Mon projet, c'est une alternative à http://emcosoftware.com/remote-console

    Je teste ton code, merci encore pour ton aide

  4. #4
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Je n'arrive pas à utiliser cette fonction, il me ressors une erreur ici:

    Index := IndexHandle(ServerSocket.Socket, ServerSocket.Socket.Handle) ;
    [dcc32 Erreur] Project1.dpr(123): E2010 Types incompatibles : 'TServerSocket' et 'TServerWinSocket'


  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pourtant la réponse était simple, suffisait de passer juste ServerSocket !
    Sinon, il faut le SocketHandle du CLIENT et non celui du Serveur !
    Il faut que tu trouves un système pour mémoriser ses SocketHandle, perso, je gère cela avec des TThread et TThreadList utilisé comme FIFO, c'est un peu tôt pour t'expliquer cela vu que tu débutes !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Index := IndexHandle(ServerSocket, Client.SocketHandle) ;
    Si tu retournes du texte depuis le OnClientRead, tu n'as pas besoin de faire aussi compliqué !


    Tu devrais discuter avec franckjoane , il semble faire la même chose que toi probleme connexion 1 serveur 2 clients
    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

  6. #6
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Index := IndexHandle(ServerSocket, Client.SocketHandle) ;
    ne fonctionne pas:
    [dcc32 Erreur] Project1.dpr(132): E2003 Identificateur non déclaré : 'Client'

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Client c'est le Socket du OnClientRead,
    Ne connaissant pas tout ton code, je ne peux pas savoir le nom de tes variables,
    j'ai volontairement utilisé le terme de "client" comme dans le titre de ton sujet.

    Si tu réponds directement depuis le OnClientRead, tu n'as pas besoin de récupérer l'ID d'un Client
    Utilise tout simplement le paramètre Socket

    ou si tu veux passer par une TThreadList, c'est une variable que TU dois définir, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TClient = record
      ReceivedText: string;
      SocketHandle: TSocket;
    end;
    Dans le OnClientRead, tu fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //---------------------------------------------------------------------------
    procedure ....ClientReadEventHandler(Sender: TObject; Socket: TCustomWinSocket);
    var
      Client: TClient;
    begin
      Client.ReceivedText := Socket.ReceiveText;
      Client.SocketHandle = Socket.SocketHandle;
      TraiterMessage(Client); // Idéalement, un TThread + TThreadList de traitement éviterait de bloquer l'évènement de lecture mais tu n'en es pas encore là !
    end;
    TraiterMessage est une fonction que TU dois écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TraiterMessage(AClient: TClient);
    var
      Index: Integer;
    begin
       Index := IndexHandle(ServerSocket, AClient.SocketHandle) ;
       if Index >= 0 then
         ServerSocket.Socket.Connections[Index].SendText('Salut, je te réponds : ' + Client.ReceivedText);
    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

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

Discussions similaires

  1. Comment récupérer l'adresse ip du client en PHP ?
    Par od.dev dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2008, 18h43
  2. Comment récupérer l'adresse IP du client ?
    Par 21247692 dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/09/2007, 12h00
  3. Récupérer le nom d'un client
    Par madness dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2007, 11h02
  4. Récupérer l'adresse IP du client en DCOM
    Par onionichan dans le forum Visual C++
    Réponses: 1
    Dernier message: 08/11/2006, 10h48
  5. [servlet] Récupérer des infos sur le client
    Par kenito dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 07/09/2005, 18h08

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