Lo sé, lo estoy haciendo muchas preguntas ... sino como un nuevo desarrollador de Delphi que siguen cayendo sobre todas estas preguntas :)Indy Escribir búfer/comunicación TCP eficiente
acuerdos este uno con el uso de la comunicación TCP Indy 10. Para que la comunicación sea eficiente, codigo una solicitud de operación del cliente como un solo byte (en la mayoría de los escenarios seguidos de otros bytes de datos, por supuesto, pero en este caso solo un byte). El problema es que
var Bytes : TBytes;
...
SetLength (Bytes, 1);
Bytes [0] := OpCode;
FConnection.IOHandler.Write (Bytes, 1);
ErrorCode := Connection.IOHandler.ReadByte;
no envía ese byte inmediatamente (al menos los servidores ejecutan el controlador no se invoca). Si cambio el '1' a '9', por ejemplo, todo funciona bien. Supuse que Indy amortigua los bytes salientes y trató de desactivar el almacenamiento en búfer de escritura con
FConnection.IOHandler.WriteBufferClose;
pero no sirvió de nada. ¿Cómo puedo enviar un solo byte y asegurarme de que se envía inmediatamente? Y, añado otra pequeña pregunta aquí, ¿cuál es la mejor manera de enviar un entero usando indy? Por desgracia no puedo encontrar la función como WriteInteger en el IOHandler de TIdTCPServer ... y
WriteLn (IntToStr (SomeIntVal))
no parece muy eficaz para mí. ¿Hace una diferencia si uso múltiples comandos de escritura en una fila o empaqueto cosas en una matriz de bytes y lo envío una vez?
¡Gracias por cualquier respuesta!
EDIT: Agregué una pista de que estoy usando Indy 10 ya que parece que hay cambios importantes con respecto a los procedimientos de lectura y escritura.
Tenga en cuenta que el envío de 1 byte no es más eficiente que el envío de más bytes. Probablemente deberías leer en TCP/IP, tamaño de paquete, sobrecarga de transferencia y todo. Existe una razón por la cual la mayoría de los antiguos protocolos de Internet usan texto, aunque el tamaño de los datos es mayor que con los datos binarios. – mghie
Este comando es una excepción. La mayoría de los comandos agregan más bytes para los parámetros del comando. Pensé que no podía ser malo empacar las cosas lo más juntas posible. ¿O estoy equivocado aquí? – jpfollenius
Siempre que su marco de datos completo se ajuste a un paquete TCP, no debería hacer mucha diferencia. Los protocolos basados en texto OTOH son una gran ayuda cuando se trata de depurar cosas. – mghie