TsgcTCPClient › Methoden › WriteAndWaitData

WriteAndWaitData Methode

Verzendt een bericht en blokkeert de aanroeper totdat de server reageert met een overeenkomend antwoord of de time-out verstrijkt.

Overloads

Overload 1

Syntaxis

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

Parameters

NaamTypeBeschrijving
aTextconst StringDe tekstpayload om naar de server te sturen. De bytes worden rechtstreeks naar de TCP-socket geschreven zonder enig frame-header.
aTimeoutconst IntegerMaximale tijd in milliseconden om te wachten op het serverantwoord. Standaard 10000 (10 seconden).

Retourwaarde

Het tekstbericht ontvangen van de server, of een lege tekenreeks wanneer de time-out is verstreken, er geen verbinding beschikbaar was, of een fout is opgetreden. (string)

Opmerkingen

WriteAndWaitData is een handige helper voor aanvraag/antwoord-uitwisselingen via een gewone TCP-socket. Het schrijft de tekenreeks als onbewerkte bytes en blokkeert vervolgens de aanroepende thread op een intern evenement totdat de volgende inkomende tekstpayload aankomt of de time-out verloopt. Omdat de TCP-client geen berichten inlijst, moet de peer een zelf-begrensde reply retourneren die de component kan doorgeven via OnMessage. Omdat de aanroep blokkeert, mag deze niet vanuit de hoofd-UI-thread worden aangeroepen tenzij een korte time-out wordt gebruikt. Een lege tekenreeks wordt geretourneerd wanneer de server niet tijdig reageert; uitzonderingen op socketniveau worden opgevangen en doorgestuurd naar OnError. Gebruik de stream-overbelasting wanneer u binaire payloads moet verzenden en ontvangen.

Wanneer de client niet is verbonden, verzendt WriteAndWaitData niets en retourneert onmiddellijk een lege tekenreeks in plaats van op de time-out te wachten. De fout wordt gemeld via OnError met Connection = nil en de foutmelding Data not sent, the client is not connected or its handshake has not completed. (resourcestring S_ERROR_CLIENT_NOT_CONNECTED). De gebeurtenis wordt geactiveerd op de aanroepende thread voordat de methode terugkeert, en LastError bevat dezelfde tekst. Er wordt geen uitzondering naar de aanroeper gegenereerd en de verbinding wordt niet verbroken. Stel Options.RaiseDisconnectExceptions in code in op False om deze melding over te slaan.

Voorbeeld


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

Overload 2

Syntaxis

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

Parameters

NaamTypeBeschrijving
aStreamconst TStreamBronstream waarvan de inhoud als ruwe bytes naar de socket wordt geschreven. De aanroeper blijft eigenaar van de stream.
aSizeconst IntegerOptionele fragmentgrootte in bytes; wanneer groter dan nul, wordt de uitgaande stream opgesplitst in meerdere fragmenten van deze grootte. Gebruik 0 (de standaard) om de volledige stream in één schrijfbewerking te verzenden.
aStreamingconst TwsStreamingStreamingmodus voor gefragmenteerde verzending (stmNone, stmStart, stmContinue, stmFinish). Standaard stmNone, wat de stream als één op zichzelf staand schrijfbewerkingen verzendt.
aTimeoutconst IntegerMaximale tijd in milliseconden om te wachten op het serverantwoord. Standaard 10000 (10 seconden).

Retourwaarde

Een nieuw toegewezen stream met het binaire antwoord ontvangen van de server, of nil wanneer de time-out is verstreken, er geen verbinding beschikbaar was of een fout is opgetreden. De aanroeper is verantwoordelijk voor het vrijgeven van de geretourneerde stream. (TStream)

Opmerkingen

Deze overload is het binaire equivalent van de tekstoverload. Het schrijft de opgegeven stream als ruwe bytes op de TCP-socket en blokkeert vervolgens de aanroepende thread op een interne gebeurtenis totdat de volgende inkomende binaire payload arriveert via OnBinary of de time-out verstrijkt. Omdat de TCP-client gegevens niet in frames verpakt, moet de peer een zelfafgebakend antwoord sturen dat het component als een afzonderlijk bericht kan afleveren. Omdat de aanroep blokkeert, dient u deze niet aan te roepen vanuit de hoofdgebruikersinterface-thread met een lange time-out. De retourwaarde is nil wanneer de server niet op tijd reageert; uitzonderingen worden opgevangen en doorgestuurd naar OnError. Wanneer de client niet is verbonden, retourneert de methode onmiddellijk nil zonder op de time-out te wachten en meldt de fout via OnError met Connection = nil, zoals beschreven voor de tekstoverload. Geef zowel de bronstream (na de aanroep) als de geretourneerde stream vrij wanneer u klaar bent.

Voorbeeld


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;

Terug naar methoden