TsgcTCPClient › Metodi › WriteAndWaitData
Invia un messaggio e blocca il chiamante finché il server non risponde con una risposta corrispondente o scade il timeout.
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| Nome | Tipo | Descrizione |
|---|---|---|
aText | const String | Il payload di testo da inviare al server. I byte vengono scritti direttamente sul socket TCP senza alcun header di framing. |
aTimeout | const Integer | Tempo massimo in millisecondi di attesa della risposta del server. Il valore predefinito è 10000 (10 secondi). |
Il messaggio di testo ricevuto dal server, o una stringa vuota quando il timeout è scaduto, nessuna connessione era disponibile o si è verificato un errore. (string)
WriteAndWaitData è un helper di convenienza per scambi di tipo richiesta/risposta su un socket TCP semplice. Scrive la stringa come byte grezzi, quindi blocca il thread chiamante su un evento interno fino all'arrivo del successivo payload di testo in entrata o alla scadenza del timeout. Poiché il client TCP non delimita i messaggi, il peer deve restituire una risposta auto-delimitata che il componente può esporre tramite OnMessage. Poiché la chiamata è bloccante, non deve essere invocata dal thread principale dell'interfaccia utente a meno che non si utilizzi un timeout breve. Viene restituita una stringa vuota quando il server non risponde in tempo; le eccezioni a livello di socket vengono intercettate e inoltrate a OnError. Utilizzare l'overload stream quando è necessario inviare e ricevere payload binari.
Quando il client non è connesso, WriteAndWaitData non invia nulla e restituisce immediatamente una stringa vuota invece di attendere il timeout. L'errore viene segnalato tramite OnError con Connection = nil e l'errore Data not sent, the client is not connected or its handshake has not completed. (resourcestring S_ERROR_CLIENT_NOT_CONNECTED). L'evento viene generato sul thread chiamante prima che il metodo restituisca il controllo, e LastError contiene lo stesso testo. Nessuna eccezione viene sollevata verso il chiamante e il client non viene disconnesso. Impostare Options.RaiseDisconnectExceptions su False nel codice per ignorare questa segnalazione.
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;
| Nome | Tipo | Descrizione |
|---|---|---|
aStream | const TStream | Stream sorgente il cui contenuto verrà scritto nel socket come byte grezzi. Il chiamante rimane proprietario dello stream. |
aSize | const Integer | Dimensione facoltativa del frammento in byte; quando è maggiore di zero, lo stream in uscita viene suddiviso in più blocchi di questa dimensione. Utilizzare 0 (valore predefinito) per inviare l'intero stream in un'unica scrittura. |
aStreaming | const TwsStreaming | Modalità di streaming per la trasmissione frammentata (stmNone, stmStart, stmContinue, stmFinish). Il valore predefinito è stmNone, che invia lo stream come un'unica scrittura autonoma. |
aTimeout | const Integer | Tempo massimo in millisecondi di attesa della risposta del server. Il valore predefinito è 10000 (10 secondi). |
Uno stream appena allocato contenente la risposta binaria ricevuta dal server, oppure nil se il timeout è scaduto, non era disponibile alcuna connessione o si è verificato un errore. Il chiamante è responsabile della liberazione dello stream restituito. (TStream)
Questo overload è la controparte binaria dell'overload di testo. Scrive lo stream fornito come byte grezzi sul socket TCP e quindi blocca il thread chiamante su un evento interno finché non arriva il successivo payload binario in ingresso tramite OnBinary oppure scatta il timeout. Poiché il client TCP non incapsula i dati in frame, il peer deve inviare una risposta auto-delimitata che il componente possa consegnare come messaggio discreto. Poiché la chiamata è bloccante, eviti di invocarla dal thread principale dell'interfaccia con un timeout lungo. Il valore restituito è nil quando il server non risponde in tempo; le eccezioni vengono intercettate e inoltrate a OnError. Quando il client non è connesso, il metodo restituisce nil immediatamente senza attendere il timeout e segnala l'errore tramite OnError con Connection = nil, come descritto per l'overload di testo. Liberi sia lo stream di origine (dopo la chiamata) sia lo stream restituito quando ha terminato di usarli.
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;