質問

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

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

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

役に立ちましたか?

解決

簡単な答えは、Delphi (およびその他のツール) で使用できる標準プロトコルでは、逆の通知が許可されていないからです。SOAPを使用したいプロジェクトのためにこれを検討しました。これらはすべて、クライアントがサーバーに質問し、サーバーが応答してそれだけであると想定しています。

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

他のヒント

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

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

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

これに必要なコンポーネントは次のとおりです。 TIdTCPサーバー (リスナー)そして TidTCPClient (送信者)。どちらも Delphi の Indy ライブラリにあります。

の ICS コンポーネント http://www.overbyte.be 素晴らしいです。a。)インディよりも優れた互換性b。)ポストカードウェアの良い例とサポート。TClientSocket と TServerSocket を使用する

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

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

RabbitMQ はあなたの要望にぴったり合うはずです。サーバーは無料ですぐに使用できます。クライアント側で接続、メッセージのプッシュ/送信、通知メッセージの取得/プルを行うだけで済みます。

サーバ: http://www.rabbitmq.com/download.htmlGoogle でクライアントを検索するか、自分で実装する

乾杯

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

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

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

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

weonlydo wodVPN コンポーネントを参照すると、堅牢な UDP ホール パンチングを作成し、ポート転送または通常の VPN (専用のネットワーク アダプターを使用) を取得できるため、NAT の背後で 2 台の PC を接続できます。

私はこのコントロールを通信プログラムに使用していますが、非常にうまく機能しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top