• ベストアンサー

HTTPストリーミングによるデータの取得方法

QuickTime のようなHTTPストリーミングを行うアプリの開発を検討しております。 おそらく、MFCのWinInetクラスを使って実装可能と思うのですが、QucikTimeは、サーバからダウンロードしたデータを取得しながら再生していますが、同様にデータを一括取得ではなく、取得しながら逐次的にデータを処理するようなしくみを実現する方法について、ご教示いただければと思います。もしありましたら、サンプルプログラムをお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> (1) UINT nRead = pFile->Read(szBuff, 1023) > は、ダウンロードが完了しなくても1023バイト受信したら、即時データが読み込めるということでよろしいでしょうか。 その通りです。再掲になりますが、TCP/IPの通信には「ダウンロードが完了」なんて概念はありません。 サーバー側から送られてきたデータを、その場ですぐに順次受け取っていくことしか出来ないのです。 (逆に「ダウンロードが完了してからデータを全部受け取る」方が面倒なぐらい) > (2) //read file... > の部分は、 > nRead = pFile->Read(szBuff, 1023); > と置き換えればいいでしょうか。 そうです。それと、受け取ったデータの処理を、Read後に書く必要があります。

daveshippo
質問者

お礼

とても参考になりました。ありがとうございました。

その他の回答 (1)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

TCP/IPの「通信プログラム」としては、ダウンロードもストリーミング再生も違いはありません。 TCP/IPでの通信では、送信側で送ったデータが 受信側にいきなり全て現れるのではなく、 細切れにされたデータが次々と届くようになってます。 例えば、 http://msdn.microsoft.com/ja-jp/library/sb35xf67(VS.80).aspx に、WinInet のサンプルプログラムがありますが、 そのプログラムでは、最大1023バイトの受信を繰り返すようになってます。 そうやって受け取ったデータの取り扱い方法で、 ・ダウンロード: 受け取ったら逐次ファイルに追記保存していく ・ストリーミング: 受け取ったら逐次表示していく といった違いは出てくるのですが、受信手順は変わりません。。

daveshippo
質問者

補足

早速のご回答ありがとうございます。 提示いただいたサンプルプログラムの、 UINT nRead = pFile->Read(szBuff, 1023); while (nRead > 0) { //read file... } で確認させていただきたいのですが、 (1) UINT nRead = pFile->Read(szBuff, 1023) は、ダウンロードが完了しなくても1023バイト受信したら、即時データが読み込めるということでよろしいでしょうか。 (2) //read file... の部分は、 nRead = pFile->Read(szBuff, 1023); と置き換えればいいでしょうか。

関連するQ&A

  • HTTP接続

    HTTPでサーバー上のファイルをダウンロードする アプリを作成中です。 HTTP接続でサーバー上のターゲットファイル名や、ファイルサイズ等を 取得したいのですが、ネット上しらべたりしたのですが、 FTP接続では同等の機能を実装したサンプルなどがあるのですが、 HTTP接続においては見当たりません。私の調べ方が悪いのかもしれませんが、 そもそも、HTTP接続において希望の処理ができるのかどうか ご教授していただけないでしょうか? ネットワークに疎いですが、早急に実装しないといけなくて 困っております。 よろしくお願いします。 VC++6.0 MFC です。

  • HTTPでページを取得。素朴な疑問

    HTTPでページを取得する場合、 ソケットを開いて、HTTP応答を受信するわけですが、 サンプルなどをネットで拾うと、その部分は大体、 while(<SOCKET>){ $s.=$_; } となっていることが多いです。 これって、SOCKETのデータが無くなったら「おしまい」ってことです よね。 そこで、質問なのですが、 極端な話、ソケットを開いた次の瞬間に、サーバーがダウンしてデータが来ないとか、或いは、重くてデータが途切れるとかって場合もあると思うんですけど、 そういった場合は、全くデータが来ないか、しっぽ切れで 終了してしまうのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • JTableからのデータの取得

    列数の多いテーブル (JTableの派生クラス) から ユーザー定義クラス (各プロパティにはsetterとgetterは実装済み) に 効率的にデータを取得する方法を教えて下さい。 データの取り込みはTableModelクラスを使って行う予定ですが 列数が多いため、列番号でIF分岐してsetterを呼ぶのは あまりに非効率な気がします。 どのように処理するのが良いのでしょうか? お知恵をおかしください。宜しくお願い致します。

    • ベストアンサー
    • Java
  • C# MySQLのデータを個別に取得する方法

    お世話になります。 C#2010EexpessEditionにて、MySQLのデータを Connector/Netを使用し、SQLで取得する勉強をしています。 サンプルなどを見ながら、DataGridViewに表示するところまでは 行きましたが、一度に表示する仕組みのため、どのように 個別に取得すればいいのかを教えてください。 サンプルは下記の通りです。 ========================================================== //SQL文と接続情報を指定し、データアダプタを作成 MySqlDataAdapter da = new MySqlDataAdapter("SELECT id,name FROM event", conn); //データ取得 da.Fill(dt); //データ表示 dataGridView1.DataSource = dt; ========================================================== daの中の、該当するデータの一行目のnameの値だけ 取り出したいのですが、どのような記述にすれば 良いでしょうか。 何卒よろしくお願いいたします。

  • mdbからのデータ取得をSQLで行いたいのですが・・・

    VB.NETで開発中です。 “TEST”という名称のmdb(MS-Access)のDBに接続し、“区分マスタ”というテーブルからデータを取得したいのですが、これをSQL文で行いたいと思っています。 サンプル的なコードを記述して教えていただけると助かります。 よろしくお願い致します。

  • ページ制御

    いつも参考にさせて頂いています。 現在下記開発環境にてアプリを開発中です。 ・struts 1.2 ・eclipse 3.0 ・JDK 1.4.12 ・tomcat 5.0 ・mysql 4.01 selectして取得したデータ数によってページ遷移(「前へ」「次へ」みたいな感じでしょうか)を実装したいと思ってますが、どのように実装すればいいのかわかりません。 oracleではROWNUMとか使ったりして実装していたのを見たことはあるのような気がするのですが、アルゴリズム的な根本的なことがわかってないので詰まっている状態です。 そこでお聞きしたいのですが、例えば120件データを取得した場合、1ページに15件まで取得して次のページにはまた15件…というふうにページを遷移する実装はどうしたらできるのでしょうか?サンプルソースなどありましたらとても助かります。 どうか宜しくお願いします。

  • HTTP コンテンツの要求

    UNIX環境上でC言語を用いてプログラミングしているのですが、完全に詰まってしまいました。 実現したい動作は、クライアントがサーバーにURLを送ってコンテンツを要求するという至って単純なものです。 現在実装が済んでいるのは、クライアントとサーバーがソケット通信をして、例えば以下のような文字列をクライアントからサーバーに送信できるようになりました。(ホスト名は適当) GET /index.html HTTP/1.1 Host: www.host.jp: 8080 調べたところ、サーバーにこの要求を渡せば対応するコンテンツが返ってくる、らしきことが書いてあったのですが、クライアントもサーバーも同じコンピュータ内にあり、ソケットでクライアントとサーバーを接続しただけで全く関係のない場所にあるコンテンツを取得できるとは到底思えません。 一体どうすればコンテンツを取得できるのか、全くわかりません。初歩的な質問かと思いますが、分かる方教えてください。

  • SWIFTでWEBページの情報を表示

    SWIFTを使って、特定のWebページの情報を取得したいです。 htmlを取得しその後XMLのタグ内からデータを取得という形なのでしょうか? 初心者の為実装方法に悩んでおります。 実現方法をご教示ください。サンプルなどあれば幸いです。

  • 【MFC】Version情報の取得

    MFCでアプリケーションを作成しています。 リソースビュー⇒「Version」⇒「VS_VERSION_INFO」の、 キー「FILEVERSION」の値を取得するにはどのように実装すれば良いのでしょうか? ご存知の方おられましたら、ご教授お願い致します。 開発環境はVC++2005です。

  • WinInet.dllを利用したHttpQueryInfoの取得

    現在、VB6.0にてWinInet.dllを利用したHTTP通信のプログラムを作成しております。 WEBサーバに対してリクエストを送るところまでは正常に動作しているのですが、リクエストに対するWEBサーバからの応答の取得がうまく動作しません。 具体的には、 HttpSendRequest(hUrl, vbNullString, 0, StrPtr(~), UBound(~)) でデータを送り、この応答を取得するために、 HttpQueryInfo(hUrl, HTTP_QUERY_STATUS_CODE, strBuffer, lngLength, 0) を記述しています。 これを実行した際、LngLengthには3が戻ってくるのですが、strBufferに戻る値が、3桁ではありません。 文字コードかデータ型の違いかで全く読み取れない値が帰ってきます。 通常であればstrBufferに入る値は何も変換なく読み取れるものなのでしょうか? 今回だと、200や404がそのまま取得できるものなのでしょうか? どなたか、分かる方がおられましたら、ご教授下さい。