TsgcTCPClient › Yöntemler › WriteAndWaitData

WriteAndWaitData Yöntem

Bir mesaj gönderir ve sunucu eşleşen bir yanıtla yanıt verene veya zaman aşımı süresi geçene kadar çağıranı bloke eder.

Aşırı Yüklemeler

Aşırı Yükleme 1

Sözdizimi

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

Parametreler

NameTypeAçıklama
aTextconst StringSunucuya gönderilecek metin yükü. Baytlar herhangi bir çerçeveleme başlığı olmadan doğrudan TCP soketine yazılır.
aTimeout const IntegerSunucu yanıtını beklemek için milisaniye cinsinden maksimum süre. Varsayılan 10000'dir (10 saniye).

Dönüş Değeri

Sunucudan alınan metin mesajı veya zaman aşımı dolduğunda, kullanılabilir bağlantı olmadığında ya da bir hata oluştuğunda boş bir dize. (string)

Remarks

WriteAndWaitData, düz bir TCP soketi üzerinden istek/yanıt tarzı alışverişler için bir kolaylık yardımcısıdır. Dizeyi ham bayt olarak yazar ve ardından bir sonraki gelen metin yükü gelene veya zaman aşımı tetiklenene kadar dahili bir olayda çağıran iş parçacığını engeller. TCP istemcisi mesajları çerçevelemediğinden, eşin bileşenin OnMessage aracılığıyla gösterebileceği kendinden sınırlı bir yanıt döndürmesi gerekir. Çağrı engellediğinden, kısa bir zaman aşımı kullanılmadıkça ana UI iş parçacığından çağrılmamalıdır. Sunucu zamanında yanıt vermediğinde boş bir dize döndürülür; soket düzeyindeki istisnalar yakalanır ve OnError öğesine iletilir. İkili yükler göndermek ve almak gerektiğinde stream aşırı yüklemesini kullanın.

İstemci bağlı değilken, WriteAndWaitData hiçbir şey göndermez ve zaman aşımını beklemeden hemen boş bir dize döndürür. Hata, Connection = nil ile birlikte OnError üzerinden ve Data not sent, the client is not connected or its handshake has not completed. hatasıyla (resourcestring S_ERROR_CLIENT_NOT_CONNECTED) bildirilir. Olay, yöntem geri dönmeden önce çağıran iş parçacığında tetiklenir ve LastError aynı metni tutar. Çağırana herhangi bir istisna fırlatılmaz ve istemcinin bağlantısı kesilmez. Bu bildirimi atlamak için kodda Options.RaiseDisconnectExceptions öğesini False olarak ayarlayın.

Örnek


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

Overload 2

Sözdizimi

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

Parametreler

NameTypeAçıklama
aStreamconst TStreamİçeriği sokete ham bayt olarak yazılacak kaynak stream. Çağıran, stream'in sahibi olarak kalır.
aSize const Integerİsteğe bağlı bayt cinsinden parça boyutu; sıfırdan büyük olduğunda giden akış bu boyutta birden çok parçaya bölünür. Tüm akışı tek bir yazmada göndermek için 0 (varsayılan) kullanın.
aStreamingconst TwsStreamingParçalı iletim için akış modu (stmNone, stmStart, stmContinue, stmFinish). Akışı tek bir bağımsız yazma olarak gönderen stmNone'a varsayılan olarak ayarlanır.
aTimeout const IntegerSunucu yanıtını beklemek için milisaniye cinsinden maksimum süre. Varsayılan 10000'dir (10 saniye).

Dönüş Değeri

Sunucudan alınan ikili yanıtı içeren yeni tahsis edilmiş bir stream veya zaman aşımı dolduğunda, bağlantı kullanılamadığında veya bir hata oluştuğunda nil. Çağıran, döndürülen stream'i serbest bırakmaktan sorumludur. (TStream)

Remarks

Bu aşırı yükleme, metin aşırı yüklemesinin ikili karşılığıdır. Sağlanan stream'i TCP soketine ham bayt olarak yazar ve ardından bir sonraki gelen ikili yük OnBinary aracılığıyla gelene veya zaman aşımı tetiklenene kadar çağıran iş parçacığını dahili bir olayda bloke eder. TCP istemcisi verileri çerçevelere sarmadığından, eş, bileşenin ayrı bir mesaj olarak teslim edebileceği kendi kendini sınırlayan bir yanıt göndermelidir. Çağrı bloke ettiğinden, uzun bir zaman aşımıyla ana UI iş parçacığından çağırmaktan kaçının. Sunucu zamanında yanıt vermediğinde dönüş değeri nil'dir; istisnalar yakalanır ve OnError öğesine iletilir. İstemci bağlı değilken, yöntem zaman aşımını beklemeden hemen nil döndürür ve hatayı, metin aşırı yüklemesi için açıklandığı gibi Connection = nil ile OnError üzerinden bildirir. İşiniz bittiğinde hem kaynak stream'i (çağrıdan sonra) hem de döndürülen stream'i serbest bırakın.

Örnek


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;

Yöntemlere Dön