3

IndyTIdTCPClientインスタンスを使用してWebサーバーと通信するDelphi6アプリケーションがあります。私がHTTPクライアントを直接使用していない理由は、サーバーが画像ストリーミングサーバーであり、画像の「プッシュ」を開始するのと同じように、ストリーミングを開始するコマンドを受信するために同じソケット接続を使用するためです。つまり、通常のHTTP POSTリクエストを送信すると、HTTPレスポンスで応答し、その直後にJPEG画像のストリームの送信を開始します。

適切なPOSTリクエストを作成し、TIdTCPClient WriteBuffer()メソッドを使用して送信し、ReadBuffer( メソッドを使用して応答データを受信する方法をすでに知っています。代わりに、POSTリクエストを送信してから、 Content-Lengthヘッダー変数がある場合は、レスポンス本文のすべてのバイトを取得するなど、一般的なHTTPレスポンスを待つようにIndyに依頼します。もちろん、受信キューでHTTP応答の後に積み上げられた可能性のあるJPEGフレームを、要求を開始するまでそのままにしておく必要があります(つまり、HTTP応答にJPEGフレームを含めないようにします。連続した読み取り呼び出しを使用して要求するまで、ストリーミング要求コマンド)。

TIdTCPClientで呼び出すことができるメソッドはありますか?これは、本文のコンテンツのみを含む一般的なHTTP応答を完全に取得します。SendCmd()を使用して、応答のLastCmdResultプロパティ(タイプ:TIdRFCReply )を確認することを考えましたが、一部としてContent-Lengthヘッダー変数がある場合、応答本文のコンテンツも取得するかどうかをIndyドキュメントから判断できません。返される応答の一部であり、応答後に受信キューの残りの部分がそのまま残っているかどうかもわかりません。

ストリーミングを開始するためのHTTPリクエストを行った直後に、JPEGフレームのストリームをプッシュするHTTP Webサーバーとのこの混合モードの相互作用を実現するための最良の方法は何ですか?

また、データのブロックを蓄積して自分で解析するのではなく、JPEGフレームのWINBONDBOUDARY区切り文字列を使用して、Indyにフレームを分割させる賢い方法がある場合は、その手法を共有してください。

4

1 に答える 1

2

HTTP応答を読み取る正しい方法は、最初にCRLFで区切られた応答ヘッダーを1行ずつ、空白行(CRLF + CRLFシーケンス)が検出されるまで読み取ることです。次に、これらのヘッダーを使用して、残りのヘッダーの読み取り方法を決定できます。応答データ。ヘッダーは、(ヘッダーを介してContent-Type)送信されているストリームの種類だけでなく、データがどのようにフレーム化されているか(、、Content-Length特定Transfer-Encoding: chunkedのものに固有のものContent-Typeなど)も示します。

ヘッダーを受け取るには、接続のCapture()メソッドを使用して、ADelimパラメーターを空白の文字列に設定します。

その後、残りのデータをどのように読み取るかは、ストリームの実際のフォーマット/フレーミングによって異なります。HTTPサーバーで使用されるストリーミングプロトコルにはいくつかの種類があり、それらのほとんどは標準化されていないため、受信しているストリームの種類を正確に知らなければ、その読み方をアドバイスする方法はありません。その情報を提供してください。そうすれば、Indyでそれを実装する方法を紹介できます。

SendCmd()HTTPプロトコルは、そのメソッドと互換性のある方法で応答をフォーマットしないため、使用できません。

于 2012-06-05T00:55:11.907 に答える