TsgcTCPClient › Metody › WriteAndWaitData

WriteAndWaitData Metoda

Wysyła wiadomość i blokuje wywołującego do czasu otrzymania przez serwer pasującej odpowiedzi lub upłynięcia limitu czasu.

Przeciążenia

Przeciążenie 1

Składnia

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

Parametry

NazwaTypOpis
aTextconst StringŁadunek tekstowy do wysłania do serwera. Bajty są zapisywane bezpośrednio do gniazda TCP bez żadnego nagłówka ramki.
aTimeoutconst IntegerMaksymalny czas oczekiwania na odpowiedź serwera w milisekundach. Domyślnie 10000 (10 sekund).

Wartość zwracana

Wiadomość tekstowa odebrana od serwera lub pusty ciąg znaków, gdy upłynął limit czasu, nie było dostępnego połączenia lub wystąpił błąd. (string)

Uwagi

WriteAndWaitData to pomocnicze narzędzie do wymiany żądanie/odpowiedź przez zwykłe gniazdo TCP. Zapisuje ciąg znaków jako nieprzetworzone bajty, a następnie blokuje wątek wywołujący na wewnętrznym zdarzeniu do momentu nadejścia kolejnego przychodzącego ładunku tekstowego lub upływu limitu czasu. Ponieważ klient TCP nie ramkuje wiadomości, partner musi zwrócić samodzielnie ograniczoną odpowiedź, którą składnik może przekazać przez zdarzenie OnMessage. Ze względu na blokowanie wywołania nie należy go używać z głównego wątku interfejsu użytkownika, o ile nie zastosowano krótkiego limitu czasu. Gdy serwer nie odpowiada w czasie, zwracany jest pusty ciąg znaków. Wyjątki na poziomie gniazda są przechwytywane i przekazywane do zdarzenia OnError. W przypadku wysyłania i odbierania ładunków binarnych należy użyć przeciążenia strumieniowego.

Gdy klient nie jest połączony, WriteAndWaitData nic nie wysyła i natychmiast zwraca pusty ciąg znaków zamiast czekać na upłynięcie limitu czasu. Błąd jest zgłaszany przez OnError z Connection = nil i komunikatem Data not sent, the client is not connected or its handshake has not completed. (resourcestring S_ERROR_CLIENT_NOT_CONNECTED). Zdarzenie jest wywoływane w wątku wywołującym, zanim metoda zwróci sterowanie, a LastError zawiera ten sam tekst. Do wywołującego nie jest zgłaszany żaden wyjątek i klient nie zostaje rozłączony. Ustaw Options.RaiseDisconnectExceptions na False w kodzie, aby pominąć to zgłoszenie.

Przykład


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

Przeciążenie 2

Składnia

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

Parametry

NazwaTypOpis
aStreamconst TStreamStrumień źródłowy, którego zawartość zostanie zapisana do gniazda jako surowe bajty. Wywołujący pozostaje właścicielem strumienia.
aSizeconst IntegerOpcjonalny rozmiar fragmentu w bajtach; gdy jest większy od zera, wychodzący strumień jest dzielony na wiele fragmentów o tym rozmiarze. Wartość 0 (domyślna) powoduje wysłanie całego strumienia w jednym zapisie.
aStreamingconst TwsStreamingTryb strumieniowania dla pofragmentowanej transmisji (stmNone, stmStart, stmContinue, stmFinish). Domyślnie stmNone, co powoduje wysłanie strumienia jako pojedynczego, samodzielnego zapisu.
aTimeoutconst IntegerMaksymalny czas oczekiwania na odpowiedź serwera w milisekundach. Domyślnie 10000 (10 sekund).

Wartość zwracana

Nowo przydzielony strumień zawierający binarną odpowiedź otrzymaną z serwera, lub nil, gdy upłynął limit czasu, nie było dostępnego połączenia lub wystąpił błąd. Wywołujący jest odpowiedzialny za zwolnienie zwróconego strumienia. (TStream)

Uwagi

To przeciążenie jest binarnym odpowiednikiem przeciążenia tekstowego. Zapisuje dostarczony strumień jako surowe bajty w gnieździe TCP, a następnie blokuje wątek wywołujący na wewnętrznym zdarzeniu do momentu nadejścia kolejnego przychodzącego binarnego ładunku przez OnBinary lub wygaśnięcia limitu czasu. Ponieważ klient TCP nie opakowuje danych w ramki, element równorzędny musi wysłać odpowiedź z własnym ogranicznikiem, którą komponent może dostarczyć jako osobną wiadomość. Ponieważ wywołanie blokuje, należy unikać wywoływania go z głównego wątku interfejsu użytkownika z długim limitem czasu. Wartość zwracana to nil, gdy serwer nie odpowiada w czasie; wyjątki są przechwytywane i przekazywane do OnError. Gdy klient nie jest połączony, metoda natychmiast zwraca nil bez oczekiwania na upłynięcie limitu czasu i zgłasza błąd przez OnError z Connection = nil, tak jak opisano dla przeciążenia tekstowego. Należy zwolnić zarówno strumień źródłowy (po wywołaniu), jak i zwrócony strumień po zakończeniu pracy z nimi.

Przykład


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;

Powrót do metod