TsgcTCPClient › Métodos › WriteAndWaitData
Envía un mensaje y bloquea al llamante hasta que el servidor responde con una respuesta coincidente o se agota el tiempo de espera.
function WriteAndWaitData(const aText: String; const aTimeout: Integer = 10000): string;
| Nombre | Tipo | Descripción |
|---|---|---|
aText | const String | La carga útil de texto que se enviará al servidor. Los bytes se escriben directamente en el socket TCP sin ninguna cabecera de encuadre. |
aTimeout | const Integer | Tiempo máximo en milisegundos para esperar la respuesta del servidor. El valor predeterminado es 10000 (10 segundos). |
El mensaje de texto recibido del servidor, o una cadena vacía cuando el tiempo de espera expiró, no había ninguna conexión disponible o se produjo un error. (string)
WriteAndWaitData es un helper de conveniencia para intercambios de tipo solicitud/respuesta sobre un socket TCP plano. Escribe la cadena como bytes sin procesar y luego bloquea el hilo invocante en un evento interno hasta que llega la siguiente carga útil de texto entrante o se agota el tiempo de espera. Dado que el cliente TCP no enmarca los mensajes, el par debe devolver una respuesta auto-delimitada que el componente pueda exponer a través de OnMessage. Dado que la llamada bloquea, no debe invocarse desde el hilo principal de la interfaz de usuario a menos que se use un tiempo de espera corto. Se devuelve una cadena vacía cuando el servidor no responde a tiempo; las excepciones a nivel de socket se capturan y se reenvían a OnError. Use la sobrecarga de flujo cuando necesite enviar y recibir cargas útiles binarias.
Cuando el cliente no está conectado, WriteAndWaitData no envía nada y devuelve una cadena vacía de inmediato en lugar de esperar al tiempo de espera. El fallo se informa a través de OnError con Connection = nil y el error Data not sent, the client is not connected or its handshake has not completed. (resourcestring S_ERROR_CLIENT_NOT_CONNECTED). El evento se activa en el hilo que realiza la llamada antes de que el método retorne, y LastError contiene el mismo texto. No se genera ninguna excepción hacia el llamador y el cliente no se desconecta. Establezca Options.RaiseDisconnectExceptions en False en el código para omitir este aviso.
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;
| Nombre | Tipo | Descripción |
|---|---|---|
aStream | const TStream | Stream de origen cuyo contenido se escribirá en el socket como bytes sin procesar. El llamante sigue siendo el propietario del stream. |
aSize | const Integer | Tamaño de fragmento opcional en bytes; cuando es mayor que cero, el flujo de salida se divide en múltiples fragmentos de ese tamaño. Use 0 (el valor predeterminado) para enviar todo el flujo en una sola escritura. |
aStreaming | const TwsStreaming | Modo de streaming para transmisión fragmentada (stmNone, stmStart, stmContinue, stmFinish). El valor predeterminado es stmNone, que envía el stream como una única escritura independiente. |
aTimeout | const Integer | Tiempo máximo en milisegundos para esperar la respuesta del servidor. El valor predeterminado es 10000 (10 segundos). |
Un stream recién asignado que contiene la respuesta binaria recibida del servidor, o nil cuando expiró el tiempo de espera, no había ninguna conexión disponible o se produjo un error. El llamador es responsable de liberar el stream devuelto. (TStream)
Esta sobrecarga es la contraparte binaria de la sobrecarga de texto. Escribe el flujo suministrado como bytes sin procesar en el socket TCP y luego bloquea el hilo llamante en un evento interno hasta que llegue la siguiente carga útil binaria entrante a través de OnBinary o hasta que expire el tiempo de espera. Dado que el cliente TCP no encapsula los datos en tramas, el par debe enviar una respuesta autodelimitada que el componente pueda entregar como mensaje discreto. Como la llamada bloquea, evite invocarla desde el hilo principal de la interfaz de usuario con un tiempo de espera largo. El valor de retorno es nil cuando el servidor no responde a tiempo; las excepciones se capturan y se reenvían a OnError. Cuando el cliente no está conectado, el método devuelve nil de inmediato sin esperar al tiempo de espera e informa del fallo a través de OnError con Connection = nil, tal y como se describe para la sobrecarga de texto. Libere tanto el flujo de origen (después de la llamada) como el flujo devuelto cuando haya terminado con ellos.
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;