4

Delphi 2006 で記述された従来のクライアント/サーバー (ファット クライアントおよびデータベース) プログラムがあります。クライアントで特定の条件が満たされた場合、他のすべてのクライアントに非常に迅速に通知する必要があります。これまで、これは UDP ブロードキャストを使用して行われてきましたが、クライアントが LAN の外部から接続し、UDP ブロードキャストがローカル ネットワークに制限されるようになったため、これは実行できなくなりました。

Indy ライブラリについては知っていますが、どのコンポーネントを使用し、どのように構成するかについてはよくわかりません。クライアントが接続してメッセージを受信および配信するサーバーが必要になると思います...? 始めるためのサンプルはありますか?

代わりに、または同様に検討すべき他のコンポーネント セットまたはテクノロジはありますか?

4

7 に答える 7

4

簡単な答えは、Delphi (およびその他のツール) で利用可能な標準プロトコルでは、逆方向の通知が許可されていないということです。SOAPを使用したいプロジェクトでこれを調べました。それらはすべて、クライアントがサーバーに要求し、サーバーが応答することを前提としています。

私にとって、解決策は RemObjects SDK でした。これにより、クライアントに通知を送信でき、通知には任意のデータを含めることができます (クライアントからサーバーへのように)。私自身は SuperTCP 接続を使用していますが、他の接続でも動作します。SOAP インターフェースを使用する必要があるクライアントに SOAP インターフェースを提供することはできますが、クライアントとサーバーの両方を制御できる場合には、非常にうまく機能します。

于 2008-09-12T10:36:00.727 に答える
2

Delphi でこれを行うための非常に簡単な方法がいくつかありますが、RemObjects SDK も非常にうまく機能すると確信しています。

  1. * TIdTCPServer がリッスンする * 中央サーバーを用意します。次に、各クライアントにはTIdTCPClientがあります。それらはサーバーに接続し、サーバーが書き込むのを待って読み取りをブロックし ます。サーバーは、リッスン ソケットを介して通知を受信すると、待機している各クライアントにブロードキャストします。これは、すべてのクライアントへのほぼ即時の通知です。
  2. TIdTCPServer がリッスンしている中央サーバーを用意します。次に、各クライアントにはTIdTCPClientがあります。これらのクライアントは、サーバーに「ping」を実行して、定期的に更新を要求できます (セッション トークンを使用して状態を維持します)。間隔の頻度によって、通知の速さが決まります。クライアントの 1 つが他のクライアントに通知する必要がある場合は、サーバーに通知するだけです。次に、サーバーはメッセージ キューを使用してすべてのアクティブなクライアント セッションのリストを作成し、それぞれに通知を追加します。次に、各クライアントが次に接続するときに、通知を送信し、キューから削除します。
  3. 各クライアントがアクティブなセッションを持っていることを定期的に更新し、切断すると自分自身を削除するデータベース内のセッション テーブルを維持します。デッド セッションを削除するメンテナンス プロセスが必要になります。次に、クライアントが現在アクティブなセッションごとに 1 つの行で更新を書き込むことができるメッセージ キュー テーブルを作成します。次に、他のクライアントは定期的にそのテーブルに ping を送信して、そのセッションに保留中の通知があるかどうかを確認し、ある場合はそれらを読み取り、それらに対処してから削除できます。
  4. ある種のピア ツー ピアアプローチでは、クライアントはデータベース内の情報を通じて互いを認識し、直接互いに接続して、通知または通知を要求します (ファイアウォールと NAT の構成によって異なります)。もう少し複雑ですが、可能です。

明らかに、実装の選択は、セットアップとニーズによって異なります。最良の結果を得るにはチューニングが必要です。

これに必要なコンポーネントは、TIdTCPServer (リスナー) とTIdTCPClient (送信者) です。どちらも Delphi の Indy ライブラリにあります。

于 2008-09-12T17:24:16.270 に答える
1

http://www.overbyte.beのICS コンポーネントはすばらしいものです。a.) Indy よりも優れた互換性 b.) PostCard ware 良い例とサポート。TClientSocket と TServerSocket を使用する

于 2008-09-15T18:59:56.263 に答える
1

RabbitMQ はあなたの法案に合うはずです。サーバーは無料で、すぐに使用できます。接続、メッセージのプッシュ/送信、および通知されたメッセージの取得/プルにクライアント側が必要なだけです

サーバー: http://www.rabbitmq.com/download.html クライアントに対して Google を実行するか、自分で実装します

乾杯

于 2011-04-20T22:33:32.820 に答える
1

FirebirdSQL プロジェクトでは、クライアントに文字列を送信するサーバーとクライアントの接続として、通知の概念を使用しています。このために、db サーバーは別のポートを使用します。また、API 呼び出しを介して特定の種類の通知を受け取るのは興味深いことです。

同じアイデアを使用できます。

于 2009-02-18T23:33:42.573 に答える
0

weonlydo wodVPNコンポーネントを見ることができます。これにより、堅牢なUDPホールパンチングを作成し、ポートフォアディングまたは通常のVPN(専用のネットワークアダプターを使用)を取得して、NATの背後にある2台のPCを接続できます。

私はこのコントロールをコミュニケーションプログラムに使用しており、非常にうまく機能しています。

于 2011-04-20T21:32:40.220 に答える
0

同じ目的でマルチキャスト UDP を使用できるはずです。唯一の違いは、すべてのクライアントからマルチキャスト グループに参加することです。

http://en.wikipedia.org/wiki/IP_Multicast

http://en.wikipedia.org/wiki/Internet_Group_Management_Protocol

編集:明確にするために、マルチキャストを使用すると、マルチキャスト IP アドレスに関連付けられた特定の「グループ」に参加できます。そのアドレスに送信されたパケットは、グループに参加しているすべてのクライアントに到達します

于 2008-09-12T10:28:15.490 に答える