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

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

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

Re[1]: 画像の転送について


(過去ログ 62 を表示中)

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

■35628 / inTopicNo.1)  画像の転送について
  
□投稿者/ Bob (1回)-(2009/05/11(Mon) 19:02:36)

分類:[.NET 全般] 

こんにちわ。

現在、デスクトップの一部をキャプチャし
それを他のPCへ転送するというソフトを作成しています。
キャプチャ自体は簡単に終わったのですが、転送をどうすればいいか分かりません。
流れとしては
ソフト自体にクライアントモードとサーバモードの2パターン用意し
クライアントの方は閲覧を、サーバの方は送信をする事になります。
サーバの方で相手に送りたいデスクトップの一部を範囲指定し、クライアントの方では送ってもらいたいサーバ側のIPを指定して

サーバ側:サーバが画面を一定時間ごとにキャプチャする→圧縮する→接続されている全てのクライアントに圧縮データを一定時間ごとに送信→繰り返す
クライアント側:一定時間ごとに送られてくる圧縮データを解凍する→画面に表示する→繰り返す
というようなのを考えています。

このファイルの転送で躓いています。
どういったシステムを使えば相応しいのかなども思いつかないのですが、上記の仕様を見た感じではどのような実装が簡単でやりやすいでしょうか?
よろしくお願いします。

環境はVisualStudio2008SP1で作成しています。
引用返信 編集キー/
■35636 / inTopicNo.2)  Re[1]: 画像の転送について
□投稿者/ .SHO (818回)-(2009/05/11(Mon) 20:12:42)
No35628 (Bob さん) に返信

サーバーに共有フォルダを作成し、サーバーは一定時間ごとに、そこに書き込む。
クライアントは、(勝手に)一定時間ごとに、そこを読み込む。

で、どうでしょう?
当然、同期は取ってませんが…
引用返信 編集キー/
■35645 / inTopicNo.3)  Re[2]: 画像の転送について
□投稿者/ Bob (2回)-(2009/05/11(Mon) 22:27:32)
No35636 (.SHO さん) に返信
> ■No35628 (Bob さん) に返信
>
> サーバーに共有フォルダを作成し、サーバーは一定時間ごとに、そこに書き込む。
> クライアントは、(勝手に)一定時間ごとに、そこを読み込む。
共有フォルダってインターネット越しでも使えましたっけ?
それに一応誰でも使えるのが想定なので、ソフト以外の設定が必要なのは避けたいです。
自分が作るアプリケーション単体で完結させておきたいです。

サーバといっても固定でサーバがあるわけではなく、普通の一般PCがサーバの役割になる事もあり得ます。
例えば私がクライアントで、.SHOさんがサーバになり
このソフトが完成しているとしたら、.SHOさんがIPを私に教えて私がそれをソフトに設定し
.SHOさんがVisual Studioのエディタ部分だけをキャプチャ選択範囲にし、実際に入力する所を半リアルタイムで
クライアント側の私が見れる、という感じのソフトが目標です。
30FPSとかでキャプチャ&送信するわけにもいかないので、実際は1秒や2秒ごとでカクカクする画像にはなると思いますが
リアルタイムが目的ではないので、それで問題ないです。
引用返信 編集キー/
■35649 / inTopicNo.4)  Re[3]: 画像の転送について
□投稿者/ Azulean (366回)-(2009/05/11(Mon) 23:07:35)
> それに一応誰でも使えるのが想定なので、ソフト以外の設定が必要なのは避けたいです。
> 自分が作るアプリケーション単体で完結させておきたいです。
最近はWindowsファイアウォールやサードパーティーのセキュリティソフトでブロックされると思うので、ソフト以外に設定が必要なケースが大半だと思います。
(単純にサーバー起動時にブロックしますかの警告だけで済むかもしれませんが)

> 30FPSとかでキャプチャ&送信するわけにもいかないので、実際は1秒や2秒ごとでカクカクする画像にはなると思いますが
> リアルタイムが目的ではないので、それで問題ないです。
プロトコルを既存のものにするのも、独自のものにするのも自由だとは思います。
ただ、自由すぎて、どうすれば良いかと問われても、回答に困りますね。

とりあえず、ご自身のアプリケーション以外には頼りたくないと言うことですので、TCP/IPのサーバーとクライアントを作るのに必要なものを考えてみて下さい。
WCFとかも使えるやもしれませんが。
引用返信 編集キー/
■35654 / inTopicNo.5)  Re[4]: 画像の転送について
□投稿者/ やじゅ (988回)-(2009/05/11(Mon) 23:51:46)
やじゅ さんの Web サイト
簡単そうなのは、「.NET Remoting」とかなんですが駄目ですかね。

プロトコルだと、VNCで使われているRFBプロトコルを使うとか・・・ むずかしそう
http://srgia.com/index.html

引用返信 編集キー/
■35668 / inTopicNo.6)  Re[4]: 画像の転送について
□投稿者/ Bob (3回)-(2009/05/12(Tue) 11:43:14)
No35649 (Azulean さん) に返信
> 最近はWindowsファイアウォールやサードパーティーのセキュリティソフトでブロックされると思うので、ソフト以外に設定が必要なケースが大半だと思います。
> (単純にサーバー起動時にブロックしますかの警告だけで済むかもしれませんが)
流石にファイアーウォールでの許可設定ぐらいならPCに詳しくなくてもできると思うので、それは含めていませんでした。
それができないとなると、ネットゲームやはてはブラウザですら使えないと思いますので。

> プロトコルを既存のものにするのも、独自のものにするのも自由だとは思います。
> ただ、自由すぎて、どうすれば良いかと問われても、回答に困りますね。
私自身初心者に毛が生えた程度ですので、何があるのか、調べて見つけてもこれは相応しい物なのか
というのが判断できず、識者の方に相談してみようと思いました。
ソフトの内容を見れば、それならこのライブラリ使えばすぐできるよ、とかわかるのかなと。

>やじゅさん
>簡単そうなのは、「.NET Remoting」とかなんですが駄目ですかね。
検索して見てみましたが、できるようなできないような・・・という印象でした。
チャットソフトとかはすぐできそうですが、画像みたいなバイナリデータを送信して受け取って みたいな事はできるんですかね?
検索してもあまり使われていないのかサンプルが少なくて。
一度チャットソフトみたいなのを作って試してみて、それから画像にできるか試してみたいと思います。

他にも何かいいアイデアや、.NET Remotingでもこうすればいいだけ、みたいなのがあればよろしくお願いします。
引用返信 編集キー/
■35717 / inTopicNo.7)  Re[5]: 画像の転送について
□投稿者/ Azulean (368回)-(2009/05/12(Tue) 23:25:03)
No35668 (Bob さん) に返信
> 流石にファイアーウォールでの許可設定ぐらいならPCに詳しくなくてもできると思うので、それは含めていませんでした。
> それができないとなると、ネットゲームやはてはブラウザですら使えないと思いますので。
私が指したファイアウォールの機能としては、ポートでのListen、つまりサーバー機能を動かした時に効果を発揮するものを意図しました。
普段使っている分(サーバーにつなぎにいくだけの状態)であれば意識しなくて済む環境であっても、いざサーバーを動かすときには意識しないといけないかなと。
あとはルーターも絡んでくると思いますが、挙げ出すとキリがないので、これらは設定できる前提と認識しておきます。



> 他にも何かいいアイデアや、.NET Remotingでもこうすればいいだけ、みたいなのがあればよろしくお願いします。
.NET RemotingやWCFは通信のための仕組みです。
うまく使えばデータの転送にも使えると思いますが、私自身はそれほど使っていないので間違っているかもしれません。

# 今回のようなプログラムは、VNCやリモートデスクトップ等のソフトが既にある現状では作る機会があまりないかもしれないなぁ…。

引用返信 編集キー/
■35725 / inTopicNo.8)  Re[6]: 画像の転送について
□投稿者/ 倉田 有大 (590回)-(2009/05/13(Wed) 00:00:09)
僕なら、ソケットつかって、最初の一行をテキストで何を送るか教えて、それからバイナリーデーター送るかな。

.NET Remoting」は初めて聞きました。ぐぐりました。面白そうだけど、難しそう。


引用返信 編集キー/
■35731 / inTopicNo.9)  Re[1]: 画像の転送について
□投稿者/ も (74回)-(2009/05/13(Wed) 02:00:24)
No35628 (Bob さん) に返信
> 現在、デスクトップの一部をキャプチャし
> それを他のPCへ転送するというソフトを作成しています。
> キャプチャ自体は簡単に終わったのですが、転送をどうすればいいか分かりません。
> 流れとしては
> ソフト自体にクライアントモードとサーバモードの2パターン用意し
> クライアントの方は閲覧を、サーバの方は送信をする事になります。
> サーバの方で相手に送りたいデスクトップの一部を範囲指定し、クライアントの方では送ってもらいたいサーバ側のIPを指定して
> ...

2008ということで,きっと .net framework 3.5 を使っているとおもいます.
クラサバ型なら System.Net.HttpListener と System.Net.WebRequest でHTTP鯖とクライアントが一発でできます.
ついでにMIMEでPNGやらBMPやらを扱えますのでいちいちプロトコルを考えなくてもOKです.

ためしに作ってみたのですが,長すぎるのでアップローダにおいておきました.
ただ,クライアント個別に「デスクトップの一部を…」のようなことはしていません.
http://u8.getuploader.com/vipprog/download/17/WindowsFormsApplication4.zip

キモの部分だけ書きます.

// クライアント側
WebRequest req = WebRequest.Create("http://" + _remote_host + ":" + DEFAULT_PORT + "/");
WebResponse res = req.GetResponse();
Image res_image = Image.FromStream(res.GetResponseStream());
res.GetResponseStream().Close();

using(Graphics g = _control_to_draw.CreateGraphics()) {
g.DrawImage(res_image, 0, 0, _control_to_draw.Width, _control_to_draw.Height);
}

// サーバ側
private void onTimer(..) {
_captured_image = スクリーンキャプチャした画像の内部形式がPNGのbyte[]
}

.....

HttpListenerContext ctx = _listener.GetContext();
ctx.Response.OutputStream.Write(_captured_image, 0, _captured_image.Length);
ctx.Response.OutputStream.Flush();
ctx.Response.OutputStream.Close();
引用返信 編集キー/
■35748 / inTopicNo.10)  Re[1]: 画像の転送について
□投稿者/ biac (95回)-(2009/05/13(Wed) 10:48:07)
biac さんの Web サイト
※ よけいなツッコミ …かもしれない f(^^;

No35628 (Bob さん) に返信
> サーバ側:サーバが画面を一定時間ごとにキャプチャする→圧縮する→接続されている全てのクライアントに圧縮データを一定時間ごとに送信→繰り返す
> クライアント側:一定時間ごとに送られてくる圧縮データを解凍する→画面に表示する→繰り返す

ここだけ見ると、 クライアントとサーバーが逆です。
 client : 依頼主、 ご主人さま --- 仕事をしろと言う側
 server : 奉仕する人、 メイドさん ( 執事さんでもいいけどw ) --- 仕事を待っている側

「圧縮データを一定時間ごとに送信」して、 処理しろと言ってる方がクライアントで、
「一定時間ごとに送られてくる圧縮データ」 を待っている方がサーバーです。

この主従関係を逆転させるには、 セッションを維持するかどうかで 2通りの考え方があります。

【A】 セッション非維持型
1. クライアント: 一定時間ごとに圧縮データを取得しに行く
2. サーバー: 最新の圧縮データを返す
3. クライアント: 取得した圧縮データを解凍して画面に表示
このパターンの実装は比較的簡単です。 も さんが提示してくれたサンプルも、 たぶんこっちでしょう。
ただし、 データの取りこぼしや、 同じデータの重複取得の問題に対応しようとすると、 複雑になっていきます。

【B】 セッション維持型
1. クライアント: 「今日の仕事を始める。 準備はいいか?」 (恒久的な通信路の確保を要求する)
2. サーバー: 「はい、 ご主人様」 (空いてるポートを使って通信路を確保)
3. クライアント: 「新しい圧縮データが出来しだい、 教えろ」 (ここで待機状態に入る)
4. サーバー: 「出来ました、 ご主人様」
5. クライアント: 「よし、 寄越せ」 (待機状態を抜けて、データ取得に)
6. サーバー: 「はい、 こちらでございます」 (データ送信)
※ 3.〜6. を、 クライアントが好きなだけ繰り返す
7. クライアント: 「ぅむ、 ご苦労だった。 今日はここまでにしておこう。」 (通信切断)
このパターンのポイントは、 2. 〜 7. までの間、 ずっと通信しっぱなしにするという点です。
HTTP では実現できません。
.NET Remoting なら出来るような気はします。 ( NAT に対応できたっけ? f(^^; )
実装するのはたぶんすごく難しいです。
また、 通信しっぱなしにするため、 同時に使えるクライアントの数に限界がでてきます。 (ポート数でも制限されるけど、 その前にプロバイダの制限に引っ掛かるんじゃないかな)


ところで。

> SHOさんがVisual Studioのエディタ部分だけをキャプチャ選択範囲にし、実際に入力する所を半リアルタイムで
> クライアント側の私が見れる、という感じのソフトが目標です。

その目的に適いそうなソフトとして、 Microsoft 製品だけでも、 SharedView (無償) ・ Windows Meeting Space ( Vista 付属 ) ・ Office Live Meeting (高価 f(^^; ) といったものがあるのですが。
http://bluewatersoft.cocolog-nifty.com/blog/2007/10/microsoft_share_7496.html
あ、 Visual Studio だけを見せることはできるけど、 どれも 「Visual Studioのエディタ部分だけ」に限定して見せるってことは出来なかったかもしれません。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -