delphi delphi-2009 indy

Delphi 2009, Indy 10, TIdTCPServer.OnExecute, cómo capturar todos los bytes en InputBuffer



delphi-2009 (2)

No deberías estar usando Readable () así. Pruebe lo siguiente en su lugar:

procedure TFormMain.IdTCPServerExecute(AContext: TIdContext); var RxBuf: TIdBytes; begin RxBuf := nil; with AContext.Connection.IOHandler do begin CheckForDataOnSource(10); if not InputBufferIsEmpty then begin InputBuffer.ExtractToBytes(RxBuf); // process RxBuf as needed... end; end; end;

Alternativamente:

procedure TFormMain.IdTCPServerExecute(AContext: TIdContext); var RxBufStr: String; // not UTF8String begin with AContext.Connection.IOHandler do begin CheckForDataOnSource(10); if not InputBufferIsEmpty then begin RxBufStr := InputBuffer.Extract(-1, enUtf8); // Alternatively to above, you can set the // InputBuffer.Encoding property to enUtf8 // beforehand, and then call TIdBuffer.Extract() // without any parameters. // // Or, set the IOHandler.DefStringEncoding // property to enUtf8 beforehand, and then // call TIdIOHandler.InputBufferAsString() // process RxBufStr as needed... end; end; end;

En cuanto a TIdSchedulerOfFiber, el paquete SuperCore está realmente muerto en este momento. No se ha trabajado en mucho tiempo y no está actualizado con la última arquitectura de Indy 10. Podemos tratar de resucitarlo en una fecha posterior, pero no está en nuestros planes para el futuro cercano.

Estoy jugando con el Indy 10 suministrado con Delphi 2009 y tengo problemas para obtener todos los datos del IOHandler cuando se activan los incendios ...

procedure TFormMain.IdTCPServerExecute(AContext: TIdContext); var RxBufStr: UTF8String; RxBufSize: Integer; begin if AContext.Connection.IOHandler.Readable then begin RxBufSize := AContext.Connection.IOHandler.InputBuffer.Size; if RxBufSize > 0 then begin SetLength(RxBufStr, RxBufSize); AContext.Connection.IOHandler.ReadBytes(TBytes(RxBufStr), RxBufSize, False); end; end; end;

AContext.Connection.IOHandler.InputBuffer.Size no parece confiable y a menudo devuelve 0, pero en la siguiente ejecución a través de OnExecute obtendrá el número correcto de bytes, pero eso es demasiado tarde.

Básicamente, quiero poder tomar todos los datos, rellenarlos en un UTF8String ( no en una cadena Unicode) y luego analizar un marcador especial. Entonces no tengo encabezados y los mensajes son de longitud variable. Parece que Indy 10 IOHandlers no están configurados para esto o solo lo estoy usando mal.

Sería bueno hacer algo así como pasar un buffer de cierto tamaño, llenarlo tanto como sea posible y devolver el número de bytes realmente llenos y luego continuar si hay más.

Como un aparte de lo que es el estado de TIdSchedulerOfFiber, esto se ve muy interesante, ¿funciona? ¿Alguien lo está usando? Noté que no está en la instalación estándar de Delphi 2009, sin embargo.

Actualización: Encontré Msg: = AContext.Connection.IOHandler.ReadLn (# 0, enUTF8); que funciona, pero aún me gustaría saber la respuesta a la pregunta anterior, ¿es porque se basa en bloquear IO? Lo que lo hace aún más entusiasta en este TIdSchedulerOfFiber.


procedure TFormMain.IdTCPServerExecute(AContext: TIdContext); var RxBufStr: UTF8String; RxBufSize: Integer; begin if AContext.Connection.IOHandler.Readable then begin AContext.Connection.IOHandler.ReadBytes(TBytes(RxBufStr),-1, False); end; end;