TsgcTCPClient › Methods › WriteAndWaitData

WriteAndWaitData Methode

Sendet eine Nachricht und blockiert den Aufrufer, bis der Server mit einer passenden Antwort antwortet oder der Timeout abläuft.

Überladungen

Overload 1

Syntax

function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;

Parameter

NameTypBeschreibung
aTextconst StringDie an den Server zu sendende Textnutzlast. Die Bytes werden ohne jeglichen Framing-Header direkt in den TCP-Socket geschrieben.
aTimeoutconst IntegerMaximale Zeit in Millisekunden, die auf die Serverantwort gewartet wird. Standard ist 10000 (10 Sekunden).

Rückgabewert

Die vom Server empfangene Textnachricht oder eine leere Zeichenfolge, wenn das Timeout abgelaufen ist, keine Verbindung verfügbar war oder ein Fehler auftrat. (string)

Hinweise

WriteAndWaitData ist ein praktischer Helfer für Austausche im Anfrage/Antwort-Stil über einen einfachen TCP-Socket. Es schreibt die Zeichenfolge als Rohbytes und blockiert dann den aufrufenden Thread auf einem internen Ereignis, bis die nächste eingehende Text-Payload eintrifft oder das Timeout auslöst. Da der TCP-Client Nachrichten nicht in Frames aufteilt, muss der Peer eine selbstbegrenzte Antwort zurückgeben, die die Komponente über OnMessage bereitstellen kann. Da der Aufruf blockiert, sollte er nicht aus dem Haupt-UI-Thread heraus aufgerufen werden, es sei denn, es wird ein kurzes Timeout verwendet. Eine leere Zeichenfolge wird zurückgegeben, wenn der Server nicht rechtzeitig antwortet; Ausnahmen auf Socket-Ebene werden abgefangen und an OnError weitergeleitet. Verwenden Sie das Stream-Overload, wenn Sie binäre Payloads senden und empfangen müssen.

Wenn der Client nicht verbunden ist, sendet WriteAndWaitData nichts und gibt sofort eine leere Zeichenfolge zurück, statt auf den Timeout zu warten. Der Fehlschlag wird über OnError mit Connection = nil und dem Fehler Data not sent, the client is not connected or its handshake has not completed. gemeldet (resourcestring S_ERROR_CLIENT_NOT_CONNECTED). Das Ereignis wird auf dem aufrufenden Thread ausgelöst, bevor die Methode zurückkehrt, und LastError enthält denselben Text. Es wird keine Ausnahme an den Aufrufer weitergegeben, und der Client wird nicht getrennt. Setzen Sie Options.RaiseDisconnectExceptions im Code auf False, um diese Meldung zu überspringen.

Beispiel


vReply := oClient.WriteAndWaitData('REQUEST', 5000);
if vReply <> '' then
  ShowMessage(vReply);

Überladung 2

Syntax

function WriteAndWaitData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone; const aTimeout: Integer = 10000) : TStream;

Parameter

NameTypBeschreibung
aStreamconst TStreamQuellstream, dessen Inhalt als rohe Bytes in den Socket geschrieben wird. Der Aufrufer bleibt Eigentümer des Streams.
aSizeconst IntegerOptionale Fragmentgröße in Bytes; wenn größer als null, wird der ausgehende Stream in mehrere Chunks dieser Größe aufgeteilt. Verwenden Sie 0 (der Standard), um den gesamten Stream in einem einzigen Schreibvorgang zu senden.
aStreamingconst TwsStreamingStreaming-Modus für die fragmentierte Übertragung (stmNone, stmStart, stmContinue, stmFinish). Standardmäßig stmNone, wodurch der Stream als einzelner eigenständiger Schreibvorgang gesendet wird.
aTimeoutconst IntegerMaximale Zeit in Millisekunden, die auf die Serverantwort gewartet wird. Standard ist 10000 (10 Sekunden).

Rückgabewert

Ein neu allokierter Stream, der die vom Server empfangene Binärantwort enthält, oder nil, wenn das Timeout abgelaufen ist, keine Verbindung verfügbar war oder ein Fehler aufgetreten ist. Der Aufrufer ist dafür verantwortlich, den zurückgegebenen Stream freizugeben. (TStream)

Hinweise

Diese Überladung ist das binäre Gegenstück zu der Text-Überladung. Sie schreibt den angegebenen Stream als Rohbytes auf den TCP-Socket und blockiert dann den aufrufenden Thread an einem internen Ereignis, bis die nächste eingehende Binärnutzlast über OnBinary eintrifft oder das Timeout ausgelöst wird. Da der TCP-Client Daten nicht in Frames verpackt, muss der Peer eine selbstbegrenzte Antwort senden, die die Komponente als diskrete Nachricht zustellen kann. Da der Aufruf blockiert, vermeiden Sie es, ihn aus dem Haupt-UI-Thread mit einem langen Timeout aufzurufen. Der Rückgabewert ist nil, wenn der Server nicht rechtzeitig antwortet; Ausnahmen werden abgefangen und an OnError weitergeleitet. Wenn der Client nicht verbunden ist, gibt die Methode sofort nil zurück, ohne auf den Timeout zu warten, und meldet den Fehlschlag über OnError mit Connection = nil, wie für die Text-Überladung beschrieben. Geben Sie sowohl den Quell-Stream (nach dem Aufruf) als auch den zurückgegebenen Stream frei, wenn Sie damit fertig sind.

Beispiel


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;

Zurück zu Methoden