TsgcWebSocketClient › Yöntemler › WriteAndWaitData
Bir metin mesajı gönderir ve sunucu bir metin mesajıyla yanıt verene veya zaman aşımı süresi geçene kadar çağıranı bloke eder.
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| Name | Type | Açıklama |
|---|---|---|
aText | const String | Sunucuya bir WebSocket metin çerçevesi olarak gönderilecek metin yükü. |
aTimeout |
const Integer | Sunucu yanıtını beklemek için milisaniye cinsinden maksimum süre. Varsayılan 10000'dir (10 saniye). |
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)
WriteAndWaitData, bir WebSocket üzerinden istek/yanıt tarzı alışverişler için kullanışlı bir yardımcıdır. Metin çerçevesini gönderir ve ardından sunucudan bir sonraki metin mesajı gelene veya zaman aşımı tetiklenene kadar çağıran iş parçacığını dahili bir olay üzerinde engeller. Engellediği için, 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 seviyesindeki istisnalar yakalanır ve OnError öğesine iletilir. İkili yükleri göndermeniz ve almanız gerektiğinde stream aşırı yüklemesini kullanın.
İstemci bağlı değilken veya WebSocket handshake'i henüz tamamlanmamışken, 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 Options.RaiseDisconnectExceptions öğesini False olarak ayarlayın. Bağlantısı koptuğu için bir yazma başarısız olduğunda ve istemci zaten yeniden bağlanmışsa, hata da Connection = nil ile bildirilir, böylece yeni bağlantı açık kalır.
vReply := oClient.WriteAndWaitData('ping', 5000);
if vReply <> '' then
ShowMessage(vReply);
function WriteAndWaitData(const aStream: TStream; const aSize: Integer = 0; const aStreaming: TwsStreaming = stmNone; const aTimeout: Integer = 10000) : TStream;
| Name | Type | Açıklama |
|---|---|---|
aStream | const TStream | İçeriği bir WebSocket ikili çerçevesi olarak gönderilecek kaynak akış. Akışın sahipliği çağırana ait 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 çerçeve olarak göndermek için 0 (varsayılan) kullanın. |
aStreaming | const TwsStreaming | Parçalı iletim için akış modu (stmNone, stmStart, stmContinue, stmFinish). Tam, bağımsız bir mesaj gönderen stmNone varsayılandır. |
aTimeout |
const Integer | Sunucu yanıtını beklemek için milisaniye cinsinden maksimum süre. Varsayılan 10000'dir (10 saniye). |
Sunucudan alınan ikili mesajı içeren yeni ayrılmış bir akış veya zaman aşımı dolduğunda, bağlantı kullanılamadığında ya da bir hata oluştuğunda nil. Döndürülen akışı serbest bırakmaktan çağıran sorumludur. (TStream)
Bu aşırı yükleme, metin diğer aşırı yüklemesinin ikili karşılığıdır. Sağlanan stream'i bir ikili çerçeve olarak yazar ve ardından sunucudan bir sonraki ikili mesaj gelene veya zaman aşımı tetiklenene kadar çağıran iş parçacığını dahili bir olay üzerinde bloke eder. Bloke ettiği için, ana UI iş parçacığından uzun bir zaman aşımıyla çağırmaktan kaçının. Sunucu zamanında yanıt vermezse dönüş değeri nil'dir; istisnalar yakalanır ve OnError'a iletilir. İstemci bağlı değilken veya handshake'i henüz tamamlanmamışken, 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.
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;