TsgcTCPClient › Methods › WriteAndWaitData
Sendet eine Nachricht und blockiert den Aufrufer, bis der Server mit einer passenden Antwort antwortet oder der Timeout abläuft.
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| Name | Typ | Beschreibung |
|---|---|---|
aText | const String | Die an den Server zu sendende Textnutzlast. Die Bytes werden ohne jeglichen Framing-Header direkt in den TCP-Socket geschrieben. |
aTimeout | const Integer | Maximale Zeit in Millisekunden, die auf die Serverantwort gewartet wird. Standard ist 10000 (10 Sekunden). |
Die vom Server empfangene Textnachricht oder eine leere Zeichenfolge, wenn das Timeout abgelaufen ist, keine Verbindung verfügbar war oder ein Fehler auftrat. (string)
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.
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;
| Name | Typ | Beschreibung |
|---|---|---|
aStream | const TStream | Quellstream, dessen Inhalt als rohe Bytes in den Socket geschrieben wird. Der Aufrufer bleibt Eigentümer des Streams. |
aSize | const Integer | Optionale 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. |
aStreaming | const TwsStreaming | Streaming-Modus für die fragmentierte Übertragung (stmNone, stmStart, stmContinue, stmFinish). Standardmäßig stmNone, wodurch der Stream als einzelner eigenständiger Schreibvorgang gesendet wird. |
aTimeout | const Integer | Maximale Zeit in Millisekunden, die auf die Serverantwort gewartet wird. Standard ist 10000 (10 Sekunden). |
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)
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.
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;