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;
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top