2011-10-19 12 views
1

私は別のプログラムに接続し、インターネット経由で別のプログラムにデータ(テキストベース)を送信するためのソフトウェアを作成します。デルファイでデータストリームを送受信する

ソフトウェアは300ミリ秒ごとに(タイマーを使用して)データを送信し、受信機はデータを適時に受信する必要があります。

接続は、任意のデータが失われる可能性が次の

  1. ようにすることができます。
  2. しかし、残りの時間は可能な限り最小遅延で到着する必要があります(最大2秒)。
  3. 遅延データは失われたとみなすことができ、無視することができます。

私はビデオ会議ソフトウェアに似ているかもしれないが、データとして単純なテキストのみを使用していると思う。

誰もが、私は(任意のINDY例)の構成要素の種類を使用することができます

  • 特に

    、このようなプログラムを作成する方法を教えてもらえます。
  • どのような技術を推奨しますか。

私はDelphiでそれを行う予定ですが、他のお勧めも大歓迎です。

===================================================================================

ストリーム経由で画像を送信することは可能ですか

+2

次に、デルファイのUDPプロトコル実装に焦点を当てます。 – TLama

+0

@Tlamaはい!私の問題は実装である – VibeeshanRC

+0

Log4Dオープンソースのロギングフレームワークには、UDPベースのクライアントとサーバー(GUIアプリケーション)のロガーコード(Indyを使用)が含まれています。これはサーバーを開始点として使用できます – mjn

答えて

3

UDPプロトコルを使用し、タイムスタンプ情報をデータに追加し、受信側で受信データを追跡することをお勧めします。 UDPサーバー(TIdUDPServer)およびクライアント(TIdUDPClient)コンポーネントは、Indyまたは他のパッケージから使用できます。クライアントコンポーネントは、データを送信し、受信するためのサーバです。

個人的に私は通常Synapse -classesを好む。彼らはIndyよりも低いレベルなので、何が起きているのかを知ることは簡単ですが、Indyがデフォルトで提供するものを自分で実装する必要があるかもしれません。

更新

実装は非常に単純です:

送信データ:フォーム上の

ドロップTIdUDPClient。 "ホスト"を受信側の名前またはIPアドレス(同じコンピュータでプログラムを実行する場合は "localhost")に設定し、サーバがリッスンしている高い番号にポートします(例:54656)。

ボタンまたはタイマーに次のコードを追加しますイベント:

IdUDPClient1.Send('Hello, world!'); 

受信データ:フォーム上の

ドロップTIdUDPServerコンポーネント。デフォルトのポートを送信アプリケーションと同じポートに設定します。コードで、OnUDPReadイベントハンドラを追加します。

MessageDlg('Received: ' + StringOf(AData), mtInformation, [mbOk], 0); 

また、新しいメッセージダイアログに新しいメッセージが受信されるたびにポップアップ表示されます。あなたは、画像が非常に小さく、1つのパケット内に収まる場合を除き、彼らは、破損していない滞在することを確認したい場合は

アップデート2

UDPは、画像のために良いではありません。

+0

ありがとうございます、より多くの実装を説明できます – VibeeshanRC

+1

クライアントは100台までです。 UDPは、より多くの数のクライアントにとってはるかに優れたスケーラビリティを備えています。また、あなたが失う可能性のある離散(短い)メッセージに対してもうまく機能します。 – Misha

+0

@Misha私はそれがアプリケーションの目的が何であるかにかかっていると思います。あなたがオンラインデータをストリーミングしていて、最新の到着データだけに興味があるのであれば、接続、切断、遅延などを心配する必要がないので、UDPは簡単です。 – Harriv

0

Indy以外のものを使用することをおすすめします。バグ(特にDelphiにバンドルされているバージョン)と他のコンポーネントセットよりも遅い。それを理解して使い始めるのは簡単ですが、フードの下で深く掘り下げれば、小さな問題に気づくでしょう。インディは常に開発中で、最新のビルドhereを見つけることができます。問題は、ハードコードされた依存関係があるため、バンドルされたバージョンを2009年以降のデルファイバージョンでより新しいものに簡単に置き換えることができないことです。

デルファイには他のネットワーク通信方式がほとんど統合されていませんが、サードパーティのコンポーネントを調べることをお勧めします。まず、オープンソースが必要な場合は、Overbyte ICSをご覧ください。それはマスターするのが少し難しいですが、それは良いパフォーマンスと機能セットを持っています。

非常に良い商用ソリューションとして、IP^Worksをご覧ください。私はそれを傷つけただけですが、私が見たものから、私はそれを全面的に推薦することができます。

+1

ごみ箱!私は2004年以来、生産にIndyを使用してきました。私はIndyと通信している20種類以上のアプリケーション(サーバーとクライアント)を持っており、Indyのコンポーネントに問題があったことは一度もありません。はい、毎日最新のビルドを実行すると、奇妙な問題が発生する可能性がありますが、これらはすばやく修正されます。私のWebサイト(http://www.csinnovations.com/framework_delphi.htm)のダウンロードから、どのように汎用コミュニケーションフレームワーク全体を構築したかが分かります。 – Misha

+0

私が説明したことは、IMAPのようなプロトコル固有のコンポーネントの問題に関連しているので、自分自身を修正する必要があります。一方、TIdTCPServerとTIdTCPClientはかなり優れていますが、特にタイムクリティカルなタスクでは、他のコンポーネントセットがIndyより優れていると主張しています。 – LightBulb

+0

特定のコンポーネントセットについては十分です(TCP、UDP、HTTP、SMTP以外のものは実際に使用しません)。 Indyと通信する時間が1ミリ秒単位で、接続に20〜50 Mbpsのスループットを得ることができるとすれば、パフォーマンス上の制限はIndy自体の実装よりも多いと思われます。 Indyをどこまで押し込むことができるかについては、ここで私の質問を見てください - http://stackoverflow.com/questions/7150093/scalable-delphi-tcp-server-implementation – Misha