TServerSocket : Indexage des clients [Résolu]

cs_rafalus 6 Messages postés mardi 25 avril 2006Date d'inscription 19 mai 2007 Dernière intervention - 17 mai 2007 à 23:03 - Dernière réponse : cs_rafalus 6 Messages postés mardi 25 avril 2006Date d'inscription 19 mai 2007 Dernière intervention
- 19 mai 2007 à 09:25
Bonjour,
développant actuellement un programme fonctionnant sur internet en utilisant les composants TServerSocket et TClientSocket, j'en suis venu à rencontrer un problème. Après une recherche, ne trouvant pas de réponse concrète, je poste ici. Revenons au problème, je vais essayer d'expliquer simplement :

J'ai une partie client et une partie serveur. Admettons que 58 clients soient connectés au serveur et que le N°37 envoit un texte quelconque que seul le serveur doit traîter pour le ramener vers ce client.

Côté client j'utilise la méthode SendText : ClientSocket1.Socket.SendText(message quelconque);

Le serveur reçoit ce message par l'événement OnClientRead, l'identifie pour savoir qu'en faire et le renvoit par :
for i:=0 to Server.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText(message quelconque);

Et c'est bien là le problème, je n'arrive pas à indexer les clients car en utilisant "for i:=0 to Server.Socket.ActiveConnections-1", je créée une boucle qui envoit le message à tous les clients or je veux le renvoyer qu'au N°37. Je me demande donc comment faire pour que le serveur sache que c'est le N°37 qui a envoyé ce message pour remplacer "i" par "37" par exemple.

J'éspère avoir été assez clair dans ma demande, merci d'avance pour vos réponses et bonne prog'.
Afficher la suite 

Votre réponse

6 réponses

Utilisateur anonyme - 18 mai 2007 à 09:32
+3
Utile
Salut,

Je ne cerne pas trop ton problème. Voila alors plusieurs cas

1)Quand le serveur recoit un message du client i, il en renvoit un autre au client i

Var
i:cardinal,;
begin
i:=(Server.Socket.ActiveConnections-1);
ServerSocket1.Socket.Connections[i].SendText(message quelconque);
End;

2)Quand le serveur recoit un message d'un client , il en renvoit un autre au client i
Var
i:Cardinal;
Begin
If (Server.Socket.ActiveConnections-1)=36 then
ServerSocket1.Socket.Connections[i].SendText(message quelconque);
End;

3)Quand le serveur recoit un message d'un client , il en renvoit un autre aux autres clients i sauf celui qui a envoyé le message :
Var
i,j:cardinal;
Begin
i:=(Server.Socket.ActiveConnections-1);
For j:=0 to (Server.Socket.ActiveConnections-1) Do
If i<>j then ServerSocket1.Socket.Connections[j].SendText(message quelconque);
End;

@+
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 19 mai 2007 à 02:16
+3
Utile
Attention tout de même à une confusion possible

Server.Socket.ActiveConnections - 1

renvoie en fait l'index du dernier client connecté au serveur.

Donc ce code :
i:=(Server.Socket.ActiveConnections-1);

ServerSocket1.Socket.Connections[i].SendText('c''est à toi que je cause');

ne sera exact que dans l'évènement OnClientConnect.

Ailleurs, il sera faux, le client qui recevra le message sera invariablement le dernier client connecté.

Pour identifier clairement et sans erreur le client auquel le serveur s'adresse,

il faut utiliser le paramètre socke
t
qui se trouve dans la plupart des évènements de TServerSocket.

Il vaudra donc mieux dans tous les cas faire :
Socket.SendText('c''est à toi que je cause');


Bonne prog'
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de japee
Utilisateur anonyme - 18 mai 2007 à 07:20
0
Utile
Salut

Server.Socket.ActiveConnections  te donne le numéro d"indexe du client. Donc la solution est :

If  (Server.Socket.ActiveConnections-1)=36 then
ServerSocket1.Socket.Connections[36].SendText(message quelconque);

@+
Commenter la réponse de Utilisateur anonyme
cs_rafalus 6 Messages postés mardi 25 avril 2006Date d'inscription 19 mai 2007 Dernière intervention - 18 mai 2007 à 08:22
0
Utile
Salut Francky,
Merci pour ta réponse. Seulement il n'est pas obligé que ce soit le N°37 qui envoit la donnée au serveur pour la renvoyer à celui-ci, ça peut très bien être le N°12,le N°45 etc. donc ce serait un peu louche de mettre :

If  (Server.Socket.ActiveConnections-1)=N°du client then
ServerSocket1.Socket.Connections[N°du client].SendText(message quelconque);

et ce pour chaque client (sachant que le nombre de clients que j'accueille n'est pas défini). C'est pour ça que je pense qu'il serait mieux  d'utiliser une variable qui détecte quel client a envoyé le message quelconque, seulement je ne sais pas comment détecter cela. Je fais donc appel à vos connaissances !

Bonne prog' !
Commenter la réponse de cs_rafalus
cs_rafalus 6 Messages postés mardi 25 avril 2006Date d'inscription 19 mai 2007 Dernière intervention - 18 mai 2007 à 09:35
0
Utile
Re,
la première proposition convient parfaitement à ma demande, je te remercie pour cette aide.

Bonne prog' !
Commenter la réponse de cs_rafalus
cs_rafalus 6 Messages postés mardi 25 avril 2006Date d'inscription 19 mai 2007 Dernière intervention - 19 mai 2007 à 09:25
0
Utile
Ah, bien vu, en effet dans mon appli ça renvoyait au dernier avec

i:=(Server.Socket.ActiveConnections-1);
ServerSocket1.Socket.Connections[i].SendText(message quelconque);

j'avais même pas eu le temps de remarquer donc merci pour le tuyau

@toute & bonne prog'.
Commenter la réponse de cs_rafalus

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.