TsgcWebSocketClient › Methoden › WriteAndWaitData
Sendet eine Textnachricht und blockiert den Aufrufer, bis der Server mit einer Textnachricht antwortet oder das Timeout abläuft.
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| Name | Typ | Beschreibung |
|---|---|---|
aText | const String | Die Textnutzlast, die als WebSocket-Text-Frame an den Server gesendet werden soll. |
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 Komforthelfer für Austauschvorgänge im Request/Response-Stil über einen WebSocket. Es sendet den Text-Frame und blockiert dann den aufrufenden Thread an einem internen Ereignis, bis die nächste Textnachricht vom Server eintrifft oder der Timeout ausgelöst wird. Da es blockiert, sollte es nicht aus dem Haupt-UI-Thread aufgerufen werden, es sei denn, es wird ein kurzer Timeout verwendet. Ein leerer String wird zurückgegeben, wenn der Server nicht rechtzeitig antwortet; Ausnahmen auf Socket-Ebene werden abgefangen und an OnError weitergeleitet. Verwenden Sie die Stream-Überladung, wenn Sie binäre Nutzdaten senden und empfangen müssen.
Wenn der Client nicht verbunden ist oder sein WebSocket-Handshake noch nicht abgeschlossen ist, sendet WriteAndWaitData nichts und gibt sofort einen leeren String 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 auf False, um diese Meldung zu überspringen. Wenn ein Schreibvorgang fehlschlägt, weil seine Verbindung verloren ging und der Client bereits erneut verbunden ist, wird der Fehlschlag ebenfalls mit Connection = nil gemeldet, sodass die neue Verbindung geöffnet bleibt.
vReply := oClient.WriteAndWaitData('ping', 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 WebSocket-Binär-Frame gesendet wird. Der Aufrufer bleibt der Eigentümer des Streams. |
aSize | const Integer | Optionale Fragmentgröße in Bytes; wenn größer als null, wird der ausgehende Stream in mehrere Fragmente dieser Größe aufgeteilt. Verwenden Sie 0 (der Standard), um den gesamten Stream als einzelnen Frame zu senden. |
aStreaming | const TwsStreaming | Streaming-Modus für die fragmentierte Übertragung (stmNone, stmStart, stmContinue, stmFinish). Standard ist stmNone, was eine vollständige eigenständige Nachricht sendet. |
aTimeout | const Integer | Maximale Zeit in Millisekunden, die auf die Serverantwort gewartet wird. Standard ist 10000 (10 Sekunden). |
Ein neu zugewiesener Stream, der die vom Server empfangene Binärnachricht enthält, oder nil, wenn das Timeout abgelaufen ist, keine Verbindung verfügbar war oder ein Fehler aufgetreten ist. Der Aufrufer ist für das Freigeben des zurückgegebenen Streams verantwortlich. (TStream)
Dieser Overload ist das binäre Gegenstück zum Text-anderen Overload. Es schreibt den übergebenen Stream als binären Frame und blockiert dann den aufrufenden Thread an einem internen Ereignis, bis die nächste binäre Nachricht vom Server eintrifft oder das Timeout greift. Da es blockiert, sollten Sie es nicht aus dem Haupt-UI-Thread mit einem langen Timeout aufrufen. Der Rückgabewert ist nil, wenn der Server nicht rechtzeitig antwortet; Ausnahmen werden abgefangen und an OnError weitergeleitet. Wenn der Client nicht verbunden ist oder sein Handshake noch nicht abgeschlossen 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;