現在、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);
終わり;
「画像ファイル」をシミュレートするには、2 つのレコードを連続して送信するだけです。それが狙いです。ここで、メモリ ストリーム全体を一度に (!) 送信しており、レコードごとに送信していないことに注意してください。しかし興味深いことに、サーバーは OnExecute イベントを 2 回実行します。
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);
一度実行したいので、将来は最初にヘッダーレコード(既知のサイズ)を読み取ってから、何が続くか/何かが続くかを確認し、それに応じて行動することができます..
助けていただければ幸いです。
読んでくれてありがとう、エイドリアン