Question

Comment les TIdTCPClient et TIdTCPServer d'Indy peuvent-ils être utilisés dans le scénario suivant:

Client  ---------- initate connection -----------> Server
...
Client  <---------------command------------------- Server
Client  ----------------response-----------------> Server
...
Client  <---------------command------------------- Server
Client  ----------------response-----------------> Server

Le client initie la connexion , mais agit comme un "serveur" (attend les commandes et les exécute).

L'approche OnExecute de TIdTCPServer ne fonctionne pas bien dans ce cas (au moins je ne la fais pas bien fonctionner).Comment pourrais-je faire cela?

J'espère que la question est suffisamment claire.

Était-ce utile?

La solution

Rien ne vous empêche de faire cela avec le composant TIdTCPServer d'Indy.

Un TIdTCPServer n'établit que la connexion. Vous devrez mettre en œuvre le reste. Ainsi, la séquence d'envoi et de réception réelle peut être celle que vous voulez.

Mettez ce code dans l'événement OnExecute de votre composant TIdTCPServer:

var
  sName: String;
begin
  // Send command to client immediately after connection
  AContext.Connection.Socket.WriteLn('What is your name?');
  // Receive response from client
  sName := AContext.Connection.Socket.ReadLn;
  // Send a response to the client
  AContext.Connection.Socket.WriteLn('Hello, ' + sName + '.');
  AContext.Connection.Socket.WriteLn('Would you like to play a game?');
  // We're done with our session
  AContext.Connection.Disconnect;
end;

Voici comment configurer le TIdTCPServer très simplement:

IdTCPServer1.Bindings.Clear;
IdTCPServer1.Bindings.Add.SetBinding('127.0.0.1', 8080);
IdTCPServer1.Active := True;

Cela indique au serveur d'écouter uniquement sur l'adresse de bouclage, au port 8080. Cela empêche quiconque en dehors de votre ordinateur de s'y connecter.

Ensuite, pour connecter votre client, vous pouvez accéder à une invite de commande Windows et saisir ce qui suit:

telnet 127.0.0.1 8080

Voici le résultat:

Quel est votre nom?

Marcus

Bonjour Marcus.

Voulez-vous jouer à un jeu?

Connexion à l'hôte perdue.

Vous n'avez pas telnet? Voici comment installer le client telnet sur Vista et 7 .

Ou avec un client TIdTCP, vous pouvez faire ceci:

var
  sPrompt: String;
  sResponse: String;
begin
  // Set port to connect to
  IdTCPClient1.Port := 8080;
  // Set host to connect to
  IdTCPClient1.Host := '127.0.0.1';
  // Now actually connect
  IdTCPClient1.Connect;
  // Read the prompt text from the server
  sPrompt := IdTCPClient1.Socket.ReadLn;
  // Show it to the user and ask the user to respond
  sResponse := InputBox('Prompt', sPrompt, '');
  // Send user's response back to server
  IdTCPClient1.Socket.WriteLn(sResponse);
  // Show the user the server's final message
  ShowMessage(IdTCPClient1.Socket.AllData);
end;

Une chose importante à noter ici est que les instructions ReadLn attendent jusqu'à ce qu'il y ait des données. C'est la magie derrière tout cela.

Autres conseils

Si vos commandes sont de nature textuelle, jetez un œil au composant TIdCmdTCPClient, il est spécialement conçu pour les situations où le serveur envoie des commandes au lieu du client.Le serveur peut utiliser TIdContext.Connection.IOHandler.WriteLn() ou TIdContext.Connection.IOHandler.SendCmd() pour envoyer les commandes.

Lorsque le client se connecte au serveur, le serveur a un événement OnConnect avec un paramètre AContext: TIdContext.

Une propriété de ceci est AContext.Connection, que vous pouvez stocker en dehors de cet événement (par exemple, dans un tableau).Si vous l'associez à l'adresse IP ou, mieux encore, à un identifiant de session généré, puis référencez cette connexion par ce critère, vous pouvez alors demander au serveur d'envoyer des commandes ou des messages ad hoc au client.

J'espère que cela vous aidera!

normalement, le client et le côté serveur ont un thread qui lit les télégrammes entrants et envoie des télégrammes en attente ... mais ce type de protocoles (envoi / réception, quand et quoi) dépend de l'application.

Le composant client Indy Telnet (TIdTelnet dans le dossier Protocols) est un très bon point de départ pour implémenter le côté client à l'aide d'un thread, en écoutant les messages du serveur.

Le client Telnet Indy se connecte au serveur telnet et utilise un seul socket pour écrire et lire les données.La lecture a lieu dans un fil de discussion.

Avec Indy, ce n'est pas possible par conception:
Indy prend uniquement en charge la communication initiée par le client, ce qui signifie que le serveur ne peut envoyer qu'une réponse aux demandes du client.
Le moyen le plus simple (mais pas le plus intelligent) d'obtenir ce que vous voulez est d'utiliser un processus d'extraction.Contrôlés par une minuterie, les clients demandent au serveur s'il y a une nouvelle commande.Bien sûr, cela entraînera beaucoup de surcharge de trafic et en fonction de votre intervalle de tirage, il y a un retard.
Vous pouvez également utiliser une autre bibliothèque comme ICS ( http://www.overbyte.be/eng/products / ics.html )

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