TsgcTCPClient › Metodi › WriteAndWaitData

WriteAndWaitData Metodo

Invia un messaggio e blocca il chiamante finché il server non risponde con una risposta corrispondente o scade il timeout.

Overload

Overload 1

Sintassi

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

Parametri

NomeTipoDescrizione
aTextconst StringIl payload di testo da inviare al server. I byte vengono scritti direttamente sul socket TCP senza alcun header di framing.
aTimeoutconst IntegerTempo massimo in millisecondi di attesa della risposta del server. Il valore predefinito è 10000 (10 secondi).

Valore restituito

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)

Note

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.

Esempio


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

Sovraccarico 2

Sintassi

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

Parametri

NomeTipoDescrizione
aStreamconst TStreamStream sorgente il cui contenuto verrà scritto nel socket come byte grezzi. Il chiamante rimane proprietario dello stream.
aSizeconst IntegerDimensione 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.
aStreamingconst TwsStreamingModalità di streaming per la trasmissione frammentata (stmNone, stmStart, stmContinue, stmFinish). Il valore predefinito è stmNone, che invia lo stream come un'unica scrittura autonoma.
aTimeoutconst IntegerTempo massimo in millisecondi di attesa della risposta del server. Il valore predefinito è 10000 (10 secondi).

Valore restituito

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)

Note

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.

Esempio


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;

Torna ai Metodi