C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: ダウンロード中のデータにアクセスする方法


(過去ログ 34 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■17169 / inTopicNo.1)  ダウンロード中のデータにアクセスする方法
  
□投稿者/ 紙屑 (1回)-(2008/04/18(Fri) 09:13:26)

分類:[VB.NET/VB2005] 

現在VB.NET2005で、ネットワークカメラから連続した画像データをダウンロードし、1枚ずつの画像に分けるプログラムを作っているのですが、
httpプロトコルでダウンロード中のデータをダウンロード完了を待たずに解析することは可能でしょうか?

できればその方法をどなたか教えてくださいませんか?
引用返信 編集キー/
■17170 / inTopicNo.2)  Re[1]: ダウンロード中のデータにアクセスする方法
□投稿者/ ぽぴ王子 (358回)-(2008/04/18(Fri) 10:20:35)
ぽぴ王子 さんの Web サイト
No17169 (紙屑 さん) に返信
> 現在VB.NET2005で、ネットワークカメラから連続した画像データをダウンロードし、1枚ずつの画像に分けるプログラムを作っているのですが、
> httpプロトコルでダウンロード中のデータをダウンロード完了を待たずに解析することは可能でしょうか?
>
> できればその方法をどなたか教えてくださいませんか?

WebClient.OpenRead メソッドあたりを利用すると、ストリームで開ける
みたいなので、なんとかなるかもしれないですね。
http://msdn2.microsoft.com/ja-jp/library/system.net.webclient.openread%28VS.80%29.aspx

もちろん、ストリームから読み込みつつ解析する部分は自分で作らないといけませんが。
引用返信 編集キー/
■17174 / inTopicNo.3)  Re[2]: ダウンロード中のデータにアクセスする方法
□投稿者/ ネタ好き (110回)-(2008/04/18(Fri) 11:35:29)
紙屑さんへ
FTPでは駄目ですか?
FTPの方がデータコネクションと制御コネクションが分かれているので制御しやすいと思います。
とはいえ、セキュリティの問題もありますから、あくまでもポートが開ければの話しです。
もし試せるのなら試してみてください。
引用返信 編集キー/
■17178 / inTopicNo.4)  Re[3]: ダウンロード中のデータにアクセスする方法
□投稿者/ Mr.T (230回)-(2008/04/18(Fri) 12:32:50)
Mr.Tです、こんにちは。
No17174 (ネタ好き さん) に返信
> 紙屑さんへ
> FTPでは駄目ですか?
> FTPの方がデータコネクションと制御コネクションが分かれているので制御しやすいと思います。
> とはいえ、セキュリティの問題もありますから、あくまでもポートが開ければの話しです。
> もし試せるのなら試してみてください。

ネットワークカメラの場合は、MotionJpegで垂れ流してくる場合のような
ことじゃないかなと思ってました。

基本は、バッファに取得したとこから、一枚分のJpegデータを切り出してやれば
いいんはずなんだけど。

引用返信 編集キー/
■17180 / inTopicNo.5)  Re[3]: ダウンロード中のデータにアクセスする方法
□投稿者/ 紙屑 (2回)-(2008/04/18(Fri) 12:40:37)
回答ありがとうございます。

No17170( ぽぴ王子 さん) に返信
WebClient.OpenReadですか、試してみます。

No17174 (ネタ好き さん) に返信
> FTPでは駄目ですか?
カメラ内のcgiを実行してダウンロードするので無理かと思います。


さきほど、WebClient.AsyncDownloadDataを使って実装を試みようとしたのですが、
「サーバーによってプロトコル違反が発生しました. Section=ResponseHeader Detail=CR の後には LF を指定しなければなりません」
というエラーが出てしまい、ダウンロードできません。

HttpWebRequestElement.UseUnsafeHeaderParsingを設定すれば回避できるとのことで

Dim hElement As New HttpWebRequestElement
hElement.UseUnsafeHeaderParsing = True

と、このようなコードをフォームのLoadイベントで実行したのですが、相変わらずエラーが出てしまいます。

解決方法をご教授願います。
引用返信 編集キー/
■17182 / inTopicNo.6)  Re[4]: ダウンロード中のデータにアクセスする方法
□投稿者/ 紙屑 (3回)-(2008/04/18(Fri) 12:45:17)
No17178 (Mr.T さん) に返信
こんにちは。

> ネットワークカメラの場合は、MotionJpegで垂れ流してくる場合のような
> ことじゃないかなと思ってました。
そのとおりです。ただ、VB.NETで私が知っている方法では、ダウンロード中にバッファにアクセスできる方法が無く、
WEBで調べてもなかなかよい記事が見つからなかったので質問させていただきました。
引用返信 編集キー/
■17183 / inTopicNo.7)  Re[4]: ダウンロード中のデータにアクセスする方法
□投稿者/ ネタ好き (113回)-(2008/04/18(Fri) 12:48:02)
2008/04/18(Fri) 12:55:57 編集(投稿者)

No17178 (Mr.T さん) に返信
Mr.Tさんこんにちは。
あっそうか。ネットワークカメラといえばMotionJpegっていうのがありましたね。
すっかり忘れていました。
.netってことは非同期でMemoryStreamにダウンロードして、
違うスレッドで解析処理をすれば大丈夫かな?
cgiで固定されているのならばFTP確かに無理っぽいですね。

引用返信 編集キー/
■17184 / inTopicNo.8)  Re[5]: ダウンロード中のデータにアクセスする方法
□投稿者/ 紙屑 (6回)-(2008/04/18(Fri) 12:57:24)
No17183 (ネタ好き さん) に返信
> ■No17178 (Mr.T さん) に返信
> Mr.Tさんこんにちは。
> あっそうか。デジカメといえばMotionJpegっていうのがありましたね。
> すっかり忘れていました。
> .netってことは非同期でMemoryStreamにダウンロードして、
> 違うスレッドで解析処理をすれば大丈夫かな?
>
まさにそれをやりたいのですが、System.Net.WebClientでは無理なのでしょうか?
引用返信 編集キー/
■17186 / inTopicNo.9)  Re[5]: ダウンロード中のデータにアクセスする方法
□投稿者/ ネタ好き (114回)-(2008/04/18(Fri) 13:06:32)
No17182 (紙屑 さん) に返信
> ■No17178 (Mr.T さん) に返信
> こんにちは。
>
>>ネットワークカメラの場合は、MotionJpegで垂れ流してくる場合のような
>>ことじゃないかなと思ってました。
> そのとおりです。ただ、VB.NETで私が知っている方法では、ダウンロード中にバッファにアクセスできる方法が無く、
> WEBで調べてもなかなかよい記事が見つからなかったので質問させていただきました。

WebClientは使い慣れていないから間違っているかもしれないけど、
DownloadDataAsync メソッドはどうかな?

引用返信 編集キー/
■17189 / inTopicNo.10)  Re[6]: ダウンロード中のデータにアクセスする方法
□投稿者/ 紙屑 (8回)-(2008/04/18(Fri) 13:21:36)
No17186 (ネタ好き さん) に返信
> WebClientは使い慣れていないから間違っているかもしれないけど、
> DownloadDataAsync メソッドはどうかな?
>
そのメソッドだとダウンロードが完了しないとデータを取得できないようです。

No.17180で書いた問題が相変わらず解決しません。
これが解決しないとダウンロードすらできないのですが、どなたか解決方法をご存知ありませんか?
引用返信 編集キー/
■17190 / inTopicNo.11)  Re[5]: ダウンロード中のデータにアクセスする方法
□投稿者/ Mr.T (231回)-(2008/04/18(Fri) 13:22:04)
No17182 (紙屑 さん) に返信
> ■No17178 (Mr.T さん) に返信
> こんにちは。
>
>>ネットワークカメラの場合は、MotionJpegで垂れ流してくる場合のような
>>ことじゃないかなと思ってました。
> そのとおりです。ただ、VB.NETで私が知っている方法では、ダウンロード中にバッファにアクセスできる方法が無く、
> WEBで調べてもなかなかよい記事が見つからなかったので質問させていただきました。

んー、まずは
>HttpWebRequestElement.UseUnsafeHeaderParsingを設定すれば回避できるとのことで

よくわかりませんが、検索するとどうも対処が違うようですが。

http://www.google.com/search?client=opera&rls=ja&q=%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E9%81%95%E5%8F%8D%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F.+Section=ResponseHeader+Detail=CR+%E3%81%AE%E5%BE%8C%E3%81%AB%E3%81%AF+LF+%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93&sourceid=opera&ie=utf-8&oe=utf-8


で、VB.NETではないですけど、こういうところは参考になりませんか。
http://msdn2.microsoft.com/ja-jp/library/bb932365.aspx

引用返信 編集キー/
■17193 / inTopicNo.12)  Re[7]: ダウンロード中のデータにアクセスする方法
□投稿者/ ネタ好き (117回)-(2008/04/18(Fri) 13:25:44)
あれ?おかしいな・・・MSDNには
「指定したリソースを Byte 配列としてダウンロードします。
このメソッドは、呼び出し元のスレッドをブロックしません。」
って書いてあるからByte配列を解析用スレッドから横取りしてしまえばいいとおもったのに。

引用返信 編集キー/
■17198 / inTopicNo.13)  Re[8]: ダウンロード中のデータにアクセスする方法
□投稿者/ なちゃ (119回)-(2008/04/18(Fri) 13:44:55)
No17193 (ネタ好き さん) に返信
> あれ?おかしいな・・・MSDNには
> 「指定したリソースを Byte 配列としてダウンロードします。
> このメソッドは、呼び出し元のスレッドをブロックしません。」
> って書いてあるからByte配列を解析用スレッドから横取りしてしまえばいいとおもったのに。

どこまで読んだか分からんぽ?
どっちにしても想定された使い方と違うなら危険な気がします。

引用返信 編集キー/
■17200 / inTopicNo.14)  Re[6]: ダウンロード中のデータにアクセスする方法
□投稿者/ 紙屑 (9回)-(2008/04/18(Fri) 13:58:42)
No17190 (Mr.T さん) に返信
> よくわかりませんが、検索するとどうも対処が違うようですが。
> http://www.google.com/search?client=opera&rls=ja&q=%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E9%81%95%E5%8F%8D%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F.+Section=ResponseHeader+Detail=CR+%E3%81%AE%E5%BE%8C%E3%81%AB%E3%81%AF+LF+%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93&sourceid=opera&ie=utf-8&oe=utf-8
ご指摘ありがとうございます。上から3番目の記事のコードを試したらうまくいきました。

> で、VB.NETではないですけど、こういうところは参考になりませんか。
> http://msdn2.microsoft.com/ja-jp/library/bb932365.aspx
とても参考になります。この記事を元に実装を検討しようと思います。



No17193 (ネタ好き さん) に返信
AyncDownloadDataは確かに別スレッドでバイト配列を取得するのですが、
ダウンロード中にバイト配列にアクセスする手段を提供していないようです。
ダウンロード終了時に発生するDownloadDataCompletedイベントをハンドルして、
ハンドラの引数からバイト配列が取得できるようです。

引用返信 編集キー/
■17210 / inTopicNo.15)  Re[7]: ダウンロード中のデータにアクセスする方法
□投稿者/ れい (488回)-(2008/04/18(Fri) 16:11:40)
No17200 (紙屑 さん) に返信
> AyncDownloadDataは確かに別スレッドでバイト配列を取得するのですが、
> ダウンロード中にバイト配列にアクセスする手段を提供していないようです。
> ダウンロード終了時に発生するDownloadDataCompletedイベントをハンドルして、
> ハンドラの引数からバイト配列が取得できるようです。

普通にWebClient、HttpWebRequest/ResponseかTCPClient、Socketでデータを取りましょう。

>「サーバーによってプロトコル違反が発生しました. Section=ResponseHeader Detail=CR の後には LF を指定しなければなりません」

は、サーバーのRFC違反で、例外を防ぐには
HttpWebRequest/ResponseやそれをつかったWebClientを使うのであれば

HttpWebRequestElement.UseUnsafeHeaderParsing = True

である必要があります。

HttpWebRequest/Responseはヘッダーやリクエストラインのの生成/解析を行ってくれるクラスで、
通常は便利ですが、
プロトコル違反のサーバーにつなぐ場合や
コネクションを細かく制御したいときにはより低レベルな実装である
TCPClinetやSocketのほうがよい場合もあります。

HTTPのプロトコルはそれほど難しいわけではなく、
汎用なものを求めているわけではないようですので、
TCPClientでも難しくは無いと思います。

WebClientを使うのであればWebClient.OpenReadを、
HttpWebRequest/Responseを使うのであればHttpWebResponse.GetResponseStreamを、
TCPClientであればTCPClient.GetStreamを。

これらストリームを使えばストリームの途中で解析が可能です。

AyncDownloadDataではできません。
また、マルチスレッドである必要はありません。
シングルスレッドでも十分に可能です。

引用返信 編集キー/
■17211 / inTopicNo.16)  Re[8]: ダウンロード中のデータにアクセスする方法
□投稿者/ 紙屑 (11回)-(2008/04/18(Fri) 16:38:52)
2008/04/18(Fri) 16:42:45 編集(投稿者)
No17210 (れい さん) に返信
わかりやすい解説ありがとうございます。
http://msdn2.microsoft.com/ja-jp/library/bb932365.aspx
ここのソースではWebRequestを使っているようですが、WebClientでも同じことができるようです。



いろいろ参考にした結果、下記のようなソースになりました。
Dim wc As New WebClient
Dim stream As New Steram
Dim buffer(BufferSize) As Byte
Dim total As Integer
Dim read As Integer

stream = wc.OpenRead("http://xxx/xxx.cgi")
total = 0
Do
   read = stream.Read(buffer, total, ReadSize)  
   total = total + read
   '解析処理

Loop



みなさんのおかげで無事に実装できそうです。本当にありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -