2012-02-15 14 views
2

私はいくつかのリモートデスクトップ機能を備えたシステムを構築しています。クライアントは、デスクトップを共有しているすべてのコンピュータとみなされます。サーバーは、複数のすべてのデスクトップのイメージを受信するデータベースを備えた中央サーバーと見なされます。クライアント側では、WindowsサービスアプリケーションとVCLフォームアプリケーションという2つのプロジェクトを構築したいと考えています。おそらく、各クライアントアプリケーションはコンピュータ上の別のユーザーアカウントで実行されているため、一度に複数のクライアントアプリケーションが実行されていて、それらのすべてがクライアントサービスにイメージを送信します。Windowsアプリケーションから大量のデータをサービスアプリに送信

サービスは、サーバーへの接続、画像の送信、およびマウス/キーボードイベントの受信を担当します。バックグラウンドで実行されているアプリケーションは、このサービスに接続してスクリーンショットをサービスに送信します。目標は、複数の「クライアント」がそこに接続してデスクトップイメージを送信できる間に、1つのサービスが実行されていることです。このサービスは、異なる "クライアント"からのこれらすべてのスクリーンショットを受け取る "中央サーバー"に接続されます。イメージは保存され、ログに記録されるか、その "クライアント"を表示しているダッシュボードにリダイレクトされます。

問題は、イメージを送信するためにクライアントアプリケーションにクライアントアプリケーションを接続するためにどのような方法を使用すべきですか?それらは同じコンピュータ上で実行されます。私は単純なコマンドパケットを送信する機能と、画像の塊をストリームする機能の両方が必要になります。私はIndyコンポーネント(TIdTCPServerなど)を使用しようとしていましたが、もっと簡単で洗練された方法で作業する必要があります。私はプロジェクトの他の場所でIndyコンポーネントも使用しています。

ここで私が目指しているシステム全体の図を示します。アプリケーションが同じコンピュータ内のサービスに接続する、右端と左端の部分が心配です。ご覧のように、レイヤーがたくさんあるので、私が使用している方法が膨大な量の画像データをストリーミングするのに十分強力であることを確認する必要があります。

System Structure

+1

[Delphi 2009:Vistaの下でWindowsサービスとデスクトップアプリケーションを通信するにはどうすればいいですか?](http://stackoverflow.com/questions/1260181/delphi-2009-how-to-communicate-between-windows- –

+0

@KenWhite私の質問は大きな画像をストリーミングすることに関するもので、他の質問は明示的に「小さな文字列」を参照しているので解決策には同意できませんが、解決策は似ているかもしれません。異なる。 –

+0

あなたはその質問に対する答えを読んで気になりましたか?「プロセス間通信」に関するいくつかの異なるオプションがありました(これは、このサイトの素晴らしい[検索](http://stackoverflow.com/search?q=interprocess+communication+ [delphi])トピックです。 '[delphi]'タグ)。 –

答えて

1

プロセスの中で、あなたはパイプ/メールスロット/ソケットを使用することができ、私も多分最も効率的な方法

+0

共有メモリでは、プロセスを一緒に接続することを提案していますか?あなたが何を意味するのか分かりません... –

+0

1.Windows APIのCreateFileMappingを使用してファイルマッピングカーネルオブジェクトを作成します。2. OpenFileMappingを使用してMapViewOfFile()を使用して共有メモリのポインタを取得します。 – horsley

+0

@horsleyは 'Memoryマップされたファイル '。そのフレーズ(ここでは 'memory mapped files delphi')やGoogleの検索で十分な情報が得られるはずです。転送したいデータの量と必要な応答性(メモリマップされたファイルには明らかに遅いディスクI/Oが関係します)に応じて、半ダースの可能性があります。 –

1

をストリームファイル共有メモリを送信している間、私は今、このを数回やったと思います通信しますさまざまな構成で使用できます。私にとって簡単にするための鍵は、通信部分を世話したRemObjects SDKを使用することでした。状態を制御するスレッドを使用すると、信頼できるサーバーまたはサービスに接続でき、ステータスバイトから何メガバイトものデータを転送することができます(大量のデータには小さなチャンクを使用することをお勧めします)エラーやフローを細かく制御することができます)。私は今、新しいバリエーションを非常に簡単に作るために展開できる高信頼性のテンプレートを用意しています。そして、新しい関数呼び出しで更新することができます(クライアントとサーバーの間でバージョンをネゴシエートするので、彼らはサポートすることができます)。すべてが高いレベルで動作するので、私のコードは単に関数呼び出しを行い、電線のフォーマットが何であるかについて決して気にしません。同様に、コアロジックを変更することなく、バイナリ形式から標準SOAPまたはその他に切り替えることができます。最後に、接続はローカルでも同じマシン(バックグラウンドサービスと話しているエンドユーザーのアプリケーションにも使用します)またはLANまたはインターネット上のマシンに接続できます。すべて同じコード内にあります。

+0

はい、私は大きなスクリーンショットを送るつもりですが、私もそれを塊に分割します。私のアプリは、画面の小さな部分と最後に撮った画像を比較し、変更された部分だけを送信します。 –

関連する問題