如何在C#中发送针对我所有应用程序的单个消息?

时间:2012-05-30 13:55:45

标签: c# tcp

我一直在研究使用TCP通过网络发送消息。

我目前的情况是我在计算机上运行单个应用程序的多个实例。我想发送一条TCP消息,让所有应用程序接收消息并对其进行操作。

所有我都能找到有1个发送者和1个接收者的例子。我不想只是将TCP消息发送到网络中,让所有的监听应用程序都收到相同的消息。

我尝试使用this guide,但它似乎也不适用于多个接收器。

任何人都可以指出我正确的方向指导我做上面描述的内容或者发布一些例子吗?

编辑:我要发送的所有内容都是一个10个字符的字符串,也许还有另一种发送/接收方式的方法吗?

4 个答案:

答案 0 :(得分:1)

您可以在C#中使用共享内存来实现您的要求。 让我解释一个简单的解决方案: 例如:

  1. 创建一个映射文件(具有特定名称,例如" XXX"),

    • 它将在内存中创建一个以字节为单位的数组,
    • 将第一个字节设置为零(0)或设置您可以定义自己的值。 (此字节将确定传入消息)
  2. 如果一个应用程序想要向其他人发送消息:

    • 从第三个元素(index = 2)将数据(使用UTF-8或任何编码转换为字节数组)写入内存数组
    • 设置第一个字节(index = 0)为1
    • 将第二个字节设置为随机值(为什么我要使用此字节?我将在下面解释。)
  3. 在接收方,他们还会打开名称相同的映射文件" XXX"

    • 他们需要在第一个字节上触发以检测传入的消息。您可以使用Timer(间隔可以是500毫秒)来检查该字节
    • 如果第一个字节是1 - >它有传入消息,然后从第三个元素(从索引2)读取数据
  4. 您现在可以从其他应用程序接收消息,但是存在一个小问题:

    • 在下一个触发器中,应用程序仍然继续对待它,就像有新的传入消息一样。
    • 所以此时,您需要读取第二个(随机)字节的值并将其存储为备份,以便在下一个触发器中进行比较。
    • 如果备份ID不等于新ID
    • ,那么这是一个真正的新传入消息
  5. 希望这能解释您如何解决问题

答案 1 :(得分:0)

答案 2 :(得分:0)

可能是愚蠢但简单而且可能......当通过干净的界面抽象时可能是一个好的开始:为应用程序选择共享目录,将包含消息的文件写入此目录并使用FileWatcher监听目录中的更改

一旦您的应用程序需要增加,请将接口实现替换为使用MSMQ或类似企业的接口实现。

另一个简单的解决方案是共享内存/ memory mapped files。从v4开始,API包含在.NET框架中。您必须手动执行读/写同步。

答案 3 :(得分:0)

这些GUI应用程序?如果是,您可以使用目标为SendMessage的{​​{1}}或PostMessage。 (虽然这只会让你发送一对数字,而不是“字符串”)

更复杂,但完全是为此目的设计的,是mailslot

  另一方面,Mailslots是进程向多个进程广播消息的简单方法