TsgcTCPClient › Métodos › WriteAndWaitData
Envia uma mensagem e bloqueia o chamador até que o servidor responda com uma resposta correspondente ou o timeout expire.
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| Name | Type | Descrição |
|---|---|---|
aText | const String | O payload de texto a enviar ao servidor. Os bytes são escritos diretamente no socket TCP sem qualquer cabeçalho de framing. |
aTimeout | const Integer | Tempo máximo em milissegundos para aguardar a resposta do servidor. O padrão é 10000 (10 segundos). |
A mensagem de texto recebida do servidor, ou uma string vazia quando o timeout expirou, nenhuma conexão estava disponível ou ocorreu um erro. (string)
WriteAndWaitData é um helper de conveniência para trocas no estilo requisição/resposta sobre um socket TCP simples. Ele grava a string como bytes brutos e então bloqueia a thread chamadora em um evento interno até que o próximo payload de texto de entrada chegue ou o timeout dispare. Como o cliente TCP não enquadra mensagens, o peer deve retornar uma resposta autodelimitada que o componente possa expor por meio de OnMessage. Como a chamada bloqueia, ela não deve ser invocada a partir da thread principal de UI a menos que um timeout curto seja utilizado. Uma string vazia é retornada quando o servidor não responde a tempo; exceções no nível do socket são capturadas e encaminhadas para OnError. Utilize a sobrecarga de stream quando você precisar enviar e receber payloads binários.
Quando o cliente não está conectado, WriteAndWaitData não envia nada e retorna uma string vazia imediatamente, em vez de aguardar o timeout. A falha é relatada através de OnError com Connection = nil e o erro Data not sent, the client is not connected or its handshake has not completed. (resourcestring S_ERROR_CLIENT_NOT_CONNECTED). O evento é disparado na thread chamadora antes que o método retorne, e LastError contém o mesmo texto. Nenhuma exceção é gerada para o chamador e o cliente não é desconectado. Defina Options.RaiseDisconnectExceptions como False no código para ignorar este relato.
vReply := oClient.WriteAndWaitData('REQUEST', 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 | Descrição |
|---|---|---|
aStream | const TStream | Stream de origem cujo conteúdo será escrito no socket como bytes brutos. O chamador permanece como proprietário do stream. |
aSize | const Integer | Tamanho de fragmento opcional em bytes; quando maior que zero, o stream de saída é dividido em múltiplos chunks deste tamanho. Use 0 (o padrão) para enviar todo o stream em uma única escrita. |
aStreaming | const TwsStreaming | Modo de streaming para transmissão fragmentada (stmNone, stmStart, stmContinue, stmFinish). Assume stmNone por padrão, que envia o stream como uma única gravação independente. |
aTimeout | const Integer | Tempo máximo em milissegundos para aguardar a resposta do servidor. O padrão é 10000 (10 segundos). |
Um stream recém-alocado contendo a resposta binária recebida do servidor, ou nil quando o timeout expirou, nenhuma conexão estava disponível, ou ocorreu um erro. O chamador é responsável por liberar o stream retornado. (TStream)
Esta sobrecarga é a contrapartida binária da sobrecarga de texto. Ela grava o stream fornecido como bytes brutos no socket TCP e então bloqueia a thread chamadora em um evento interno até que o próximo payload binário recebido chegue via OnBinary ou o timeout seja atingido. Como o cliente TCP não encapsula dados em frames, o peer deve enviar uma resposta autodelimitada que o componente possa entregar como uma mensagem discreta. Como a chamada bloqueia, evite invocá-la a partir da thread de UI principal com um timeout longo. O valor de retorno é nil quando o servidor não responde a tempo; as exceções são capturadas e encaminhadas a OnError. Quando o cliente não está conectado, o método retorna nil imediatamente, sem aguardar o timeout, e relata a falha através de OnError com Connection = nil, como descrito para a sobrecarga de texto. Libere tanto o stream de origem (após a chamada) quanto o stream retornado quando terminar de usá-los.
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;