3

TCPを使用してネットワーク経由でメッセージを送信することを検討しています。

私の現在の状況は、コンピューター上で実行されている単一のアプリケーションの複数のインスタンスがあるということです。単一の TCP メッセージを送信し、すべてのアプリケーションがメッセージを受信して​​処理できるようにしたいと考えています。

送信者が 1 人、受信者が 1 人の例を見つけることができました。TCP メッセージをネットワークに送信して、リッスンしているすべてのアプリケーションが同じメッセージを受信できるようにしたくありません。

このガイドを使用しようとしましたが、複数の受信機でも機能しないようです。

誰かが私を正しい方向に向けて、私が上で説明したことをしたり、いくつかの例を投稿したりするガイドを教えてもらえますか?

編集:私が送信しようとしているのは10文字の文字列だけです。おそらく、そのようなものを送受信する別の方法もありますか?

4

4 に答える 4

1

C# で共有メモリを使用して、要件を実装できます。簡単な解決策を説明しましょう:例:

  1. マップされたファイルを作成します (特定の名前で、「XXX」など)。

    • メモリ内にバイト単位の配列を作成し、
    • 最初のバイトをゼロ (0) に設定するか、独自に定義できる値を設定します。(このバイトは着信メッセージを決定します)
  2. あるアプリケーションが他のアプリケーションにメッセージを送信したい場合:

    • 3 番目の要素 (インデックス = 2) からメモリ配列にデータ (UTF-8 または任意のエンコーディングを使用してバイト配列に変換) を書き込みます。
    • 最初のバイト (インデックス =0) を 1 に設定します
    • 2 番目のバイトをランダムな値に設定します (なぜこのバイトを使用するのでしょうか? 以下で説明します)。
  3. 受信側では、同じ名前の「XXX」のマップされたファイルも開きます。

    • 着信メッセージを検出するには、最初のバイトでトリガーする必要があります。Timer (間隔は 500 ミリ秒) を使用して、そのバイトを確認できます。
    • 最初のバイトが 1 の場合 -> 受信メッセージがある場合、3 番目の要素 (インデックス 2 から) からデータを読み取ります
  4. 他のアプリケーションからメッセージを受信できるようになりましたが、小さな問題があります。

    • 次のトリガーでは、アプリケーションは新しい着信メッセージがあるかのように扱い続けます。
    • したがって、この時点で、2 番目の (ランダム化された) バイトの値を読み取り、次のトリガーでの比較のためにバックアップとして保存する必要があります。
    • バックアップ ID が新しい ID と等しくない場合、これは実際の新しい受信メッセージです。

これが問題を解決する方法を説明していることを願っています

于 2016-11-01T04:35:19.783 に答える
0

すべてのアプリケーション インスタンスにメッセージを送信する場合は、SignalR.

このフレームワークを紹介する投稿がいくつかあります。

于 2012-06-06T12:30:08.283 に答える
0

これらは GUI アプリケーションですか? はいの場合、SendMessageまたはPostMessageを宛先として使用できますHWND_BROADCAST。(ただし、これは「文字列」ではなく、数値のペアのみを送信できます)

より複雑ですが、この目的のために正確に設計されたものはメールスロットです。

一方、メールスロットは、プロセスがメッセージを複数のプロセスにブロードキャストする簡単な方法です。

于 2012-06-09T19:28:26.640 に答える
0

おそらくばかげていますが、シンプルで可能です..そして、きれいなインターフェースを介して抽象化された場合、おそらく良いスタートです: アプリケーションの共有ディレクトリを選択し、メッセージを含むファイルをこのディレクトリに書き込み、FileWatcher を使用してディレクトリの変更をリッスンします。

アプリケーションのニーズが高まったら、インターフェイスの実装を、MSMQ または同様の企業向けのものを使用するものに置き換えます。

もう 1 つの簡単な解決策は、共有メモリ/メモリ マップ ファイルです。API は、v4 以降の .NET フレームワークに含まれています。ただし、手動で読み取り/書き込み同期を行う必要があります。

于 2012-06-06T13:04:09.120 に答える