В настоящее время я пытаюсь использовать Indy для написания собственного протокола более высокого уровня поверх TCP. По сути, я хочу отправить запись (используя поток), но эта запись может указывать на то, что последующие x байтов будут файлом изображения.
Таким образом, когда запись получена на сервере, если ее содержимое указывает, что за ней следует изображение, необходимо разделить данные записи и изображения.
var
Segment: TDPPSegment;
Segment2: TDPPSegment;
Buffer: TIdBytes;
Buffer2: TIdBytes;
Mem: TMemoryStream;
begin
if (Client.Connected) then begin
Segment.NameStr := 'Adrian';
Segment2.NameStr := 'Jon';
Mem := TMemoryStream.Create;
Mem.Write(Segment, SizeOf(Segment));
Mem.Write(Segment2, SizeOf(Segment2));
//The Size of the stream is 8 bytes here!
Client.IOHandler.Write(Mem, 0, False);
конец;
Чтобы смоделировать «файл изображения», я просто хочу послать ДВЕ записи последовательно; это цель. Обратите внимание: я отправляю весь поток памяти сразу (!), А НЕ записываю за записью. Но что интересно, сервер дважды запускает событие OnExecute!
var
Buffer: TIdBytes;
Segment: TDPPSegment;
Mem: TMemoryStream;
begin
Mem := TMemoryStream.Create;
AContext.Connection.IOHandler.ReadStream(Mem, SizeOf(TDPPSegment), False);
//Incoming stream size is FOUR bytes but TWICE!
Mem.Position := 0;
Mem.Read(Segment, SizeOf(TDPPSegment));
Showmessage(Segment.NameStr);
Я хочу, чтобы он выполнялся один раз, поэтому в будущем я могу сначала прочитать запись заголовка (известный размер), а ЗАТЕМ посмотреть, что / если что-то будет следовать, и действовать соответственно ..
Помощь будет принята с благодарностью!
Спасибо за чтение, Адриан