TsgcTCPClient › Methods › WriteAndWaitData
Envoie un message et bloque l'appelant jusqu'à ce que le serveur réponde avec une réponse correspondante ou que le délai d'expiration s'écoule.
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| Nom | Type | Description |
|---|---|---|
aText | const String
| La charge utile texte à envoyer au serveur. Les octets sont écrits directement dans le socket TCP sans aucun en-tête de trame. |
aTimeout | const Integer
| Durée maximale en millisecondes pour attendre la réponse du serveur. Par défaut 10000 (10 secondes). |
Le message texte reçu du serveur, ou une chaîne vide si le délai d'attente a expiré, si aucune connexion n'était disponible ou si une erreur s'est produite. (string)
WriteAndWaitData est un assistant pratique pour les échanges de type requête/réponse sur un socket TCP simple. Il écrit la chaîne en octets bruts puis bloque le thread appelant sur un événement interne jusqu'à ce que la prochaine charge utile de texte entrante arrive ou que le délai d'attente expire. Comme le client TCP ne trame pas les messages, le pair doit retourner une réponse auto-délimitée que le composant peut remonter via OnMessage. Comme l'appel bloque, il ne doit pas être invoqué depuis le thread principal de l'interface utilisateur sauf si un court délai d'attente est utilisé. Une chaîne vide est retournée lorsque le serveur ne répond pas à temps ; les exceptions au niveau du socket sont interceptées et transmises à OnError. Utilisez la surcharge de flux lorsque vous devez envoyer et recevoir des charges utiles binaires.
Lorsque le client n'est pas connecté, WriteAndWaitData n'envoie rien et retourne immédiatement une chaîne vide au lieu d'attendre le délai d'attente. L'échec est signalé via OnError avec Connection = nil et l'erreur Data not sent, the client is not connected or its handshake has not completed. (resourcestring S_ERROR_CLIENT_NOT_CONNECTED). L'événement se déclenche sur le thread appelant avant que la méthode ne retourne, et LastError contient le même texte. Aucune exception n'est levée vers l'appelant et le client n'est pas déconnecté. Définissez Options.RaiseDisconnectExceptions sur False dans le code pour ignorer ce signalement.
vReply := oClient.WriteAndWaitData('REQUEST', 5000);
if vReply <> '' then
ShowMessage(vReply);
function WriteAndWaitData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone; const aTimeout: Integer = 10000) : TStream;
| Nom | Type | Description |
|---|---|---|
aStream | const TStream
| Flux source dont le contenu sera écrit dans le socket en tant qu'octets bruts. L'appelant reste propriétaire du flux. |
aSize | const Integer
| Taille de fragment optionnelle en octets ; lorsqu'elle est supérieure à zéro, le flux sortant est découpé en plusieurs morceaux de cette taille. Utilisez 0 (la valeur par défaut) pour envoyer l'intégralité du flux en une seule écriture. |
aStreaming
| const TwsStreaming
| Mode de streaming pour la transmission fragmentée (stmNone, stmStart, stmContinue, stmFinish). Par défaut stmNone, ce qui envoie le flux comme une seule écriture autonome. |
aTimeout | const Integer
| Durée maximale en millisecondes pour attendre la réponse du serveur. Par défaut 10000 (10 secondes). |
Un flux nouvellement alloué contenant la réponse binaire reçue du serveur, ou nil lorsque le délai d'expiration s'est écoulé, qu'aucune connexion n'était disponible ou qu'une erreur s'est produite. L'appelant est responsable de la libération du flux retourné. (TStream)
Cette surcharge est la contrepartie binaire de la surcharge texte. Elle écrit le flux fourni en octets bruts sur le socket TCP puis bloque le thread appelant sur un événement interne jusqu'à ce que la prochaine charge utile binaire entrante arrive via OnBinary ou que le timeout se déclenche. Comme le client TCP ne encadre pas les données, le pair doit envoyer une réponse auto-délimitée que le composant peut livrer comme message discret. Comme l'appel bloque, évitez de l'invoquer depuis le thread principal de l'interface utilisateur avec un long timeout. La valeur de retour est nil lorsque le serveur ne répond pas dans le délai ; les exceptions sont interceptées et transmises à OnError. Lorsque le client n'est pas connecté, la méthode retourne nil immédiatement sans attendre le délai d'attente et signale l'échec via OnError avec Connection = nil, comme décrit pour la surcharge texte. Libérez à la fois le flux source (après l'appel) et le flux retourné lorsque vous en avez terminé.
oRequest := TMemoryStream.Create;
try
oRequest.LoadFromFile('request.bin');
oReply := oClient.WriteAndWaitData(oRequest, 0, stmNone, 5000);
try
if Assigned(oReply) then
oReply.SaveToFile('reply.bin');
finally
oReply.Free;
end;
finally
oRequest.Free;
end;