Comment stocker un identifiant dans un ListView une connexion client - Indy 10
-
27-10-2019 - |
Question
Je suis en train de créer un serveur TCP qui reçoit plusieurs clients et doit être en mesure d'envoyer des messages à chacun.
Comment puis-je obtenir une poignée à la connexion client, puis envoyer des données arbitraires?
Merci: D
Code:
procedure TFRM_Main.ServerConnect(AContext: TIdContext);
var lAdd: TListItem;
var Index: integer;
begin
lAdd := ListView.Items.Add;
//AContext connection ID, what to do here?
lAdd.Caption := IntToStr(Index);
end;
La solution
utilisation:
AContext.Connection.IOHandler.Write( (* bytes *) );
AContext.Connection.IOHandler.WriteFile( (* send a file to the client *) );
Pour plus d'options, juste Invoke la complétion de code (CTRL + SPACE) après IOHandler et voir les options disponibles, il y a quelque temps, je l'ai écrit une application simple de test client / serveur, cliquez sur ici pour voir et / ou d'une source de téléchargement.
Autres conseils
TIdTCPServer
est un composant multithread. Accès à l'interface directement à partir de son événement OnConnect
(ou OnDisconnect
, OnExecute
ou OnException
) ne sont pas thread-safe! Vous devez utiliser TIdSync
d'Indy ou la classe TIdNotify
pour accéder à l'interface en toute sécurité.
Pour répondre à la question initiale, la plus simple, mais pas nécessairement la plus sûre, simple est de stocker le pointeur d'objet TIdContext.Connection
dans la propriété TListItem.Data
. Le code principal de fil aura alors un accès direct à la connexion quand il en a besoin.
Je ne conseille pas, cependant. Une solution plus sûre consiste à identifier de manière unique chaque client vous, comme avec un nom d'utilisateur que le client envoie, et stocker cet identifiant dans les propriétés de TIdContext.Data
et TListItem.Data
. Puis, lorsque votre code principal de thread désire envoyer un message à un client, il peut boucle à travers la liste TIdTCPServer.Contexts
recherche de l'ID désiré, et si trouvé alors il aura accès à l'objet TIdContext.Connection
correspondant.