TsgcTCPClient › Methods › WriteData

WriteData Metoda

Wysyła wiadomość tekstową lub binarną do serwera TCP przez surowe gniazdo.

Przeciążenia

Przeciążenie 1

Składnia

procedure WriteData(const aText: String; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone);

Parametry

NazwaTypOpis
aTextconst StringŁadunek tekstowy do wysłania do serwera. Bajty są zapisywane bezpośrednio do gniazda TCP bez żadnego nagłówka ramki.
aSizeconst IntegerOpcjonalny rozmiar fragmentu w bajtach; gdy wartość jest większa od zera, ładunek jest dzielony na wiele fragmentów o tym rozmiarze. Wartość 0 (domyślna) powoduje wysłanie całego ładunku w jednym zapisie.
aStreamingconst TwsStreamingTryb przesyłania strumieniowego dla transmisji fragmentowanej (stmNone, stmStart, stmContinue, stmFinish). Domyślnie stmNone, co powoduje wysłanie ładunku jako jednego samodzielnego zapisu.

Uwagi

Metoda WriteData przesyła ciąg jako surowe bajty przez aktywne połączenie TCP. W odróżnieniu od klienta WebSocket nie ma nagłówka ramki tekstowej; odbiorca otrzymuje dokładnie wysłane bajty, dlatego obie strony muszą uzgodnić separator lub przedrostek długości. Domyślnie wywołanie jest wykonywane w wątku wywołującym i kończy się po przekazaniu bajtów do gniazda. Gdy właściwość QueueOptions.Text jest ustawiona na wartość inną niż qmNone, wiadomość jest kolejkowana i faktycznie wysyłana z własnego wątku połączenia, co zapobiega blokowaniu, gdy wiele wątków zapisuje jednocześnie. Wszelkie wyjątki gniazda są przekazywane do zdarzenia OnError. Do wysyłania dużych ładunków lub danych binarnych należy użyć przeciążenia strumieniowego.

Gdy klient nie jest połączony, nic nie jest wysyłane, a 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 WriteData 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 i po cichu odrzucić wiadomość, tak jak robiły to wcześniejsze wersje. Gdy zapis kończy się niepowodzeniem, ponieważ jego połączenie zostało utracone, a klient już się ponownie połączył, błąd jest również zgłaszany z Connection = nil, dzięki czemu nowe połączenie pozostaje otwarte.

Przykład


oClient.WriteData('Hello Server');

Przeciążenie 2

Składnia

procedure WriteData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone);

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, strumień jest dzielony na wiele porcji 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.

Uwagi

WriteData odczytuje podany strumień od jego bieżącej pozycji i przesyła zawartość jako nieprzetworzone bajty przez gniazdo TCP. Ponieważ klient TCP nie opakowuje danych w ramki WebSocket, partner musi wiedzieć, jak rozgraniczać przychodzące bajty (zazwyczaj za pomocą prefiksu długości lub separatora na poziomie aplikacji). Wywołanie jest domyślnie wykonywane w wątku wywołującym; gdy właściwość QueueOptions.Binary ma wartość inną niż qmNone, wiadomość jest kolejkowana i faktycznie wysyłana z wątku połączenia. Wyjątki gniazda są przechwytywane i przekazywane do OnError. Gdy klient nie jest połączony, nic nie jest wysyłane, a błąd jest zgłaszany przez OnError z Connection = nil, tak jak opisano dla przeciążenia tekstowego. Strumień należy zwolnić dopiero po powrocie wywołania (lub, w przypadku kolejkowania, po zakończeniu wysyłania).

Przykład


oStream := TMemoryStream.Create;
try
  oStream.LoadFromFile('payload.bin');
  oClient.WriteData(oStream);
finally
  oStream.Free;
end;

Powrót do metod