【问题标题】:How can I send a single message targeted to all my applications in C#?如何在 C# 中向我的所有应用程序发送一条消息?
【发布时间】:2016-11-01 13:55:14
【问题描述】:

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

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

我能找到有 1 个发送者和 1 个接收者的示例。我不想只是向网络发送一条 TCP 消息,然后让所有监听应用程序接收相同的消息。

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

任何人都可以将我指向正确的方向,指向执行我上面描述的指南或发布一些示例吗?

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

【问题讨论】:

  • @Adriano 我现在正在检查这个...
  • 你不能在本地广播中使用 UDP 吗?
  • 就个人而言,我会为此使用预先存在的集线器。也许 redis pub/sub - 设置起来真的很简单(即零配置,零注册 - 只需 "publish channel_name message"
  • UDP 广播听起来像是我需要的协议。感谢到目前为止的建议。我会调查的。
  • 如果您想拥有可靠的网络通信,UDP 不是您所寻找的。它缺少错误 - 交付检查并在失败时重试(TCP 具有)。但是,如果您仅在单个界面上本地工作,或者不在乎是否确实会收到消息,那么就去吧:)

标签: c# tcp


【解决方案1】:

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

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

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

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

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

    • 在下一个触发器中,应用程序仍继续将其视为有新的传入消息。
    • 所以此时,您需要读取第二个(随机)字节的值并将其存储为备份,以便在下次触发时进行比较。
    • 如果备份 id 不等于新 id,则这是一条真正的新传入消息

希望这能解释您如何解决问题

【讨论】:

    【解决方案2】:

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

    一旦您的应用程序需求上升,请用使用 MSMQ 或类似企业的接口实现替换接口实现。

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

    【讨论】:

      【解决方案3】:

      这些是 GUI 应用程序吗?如果是,您可以使用SendMessagePostMessageHWND_BROADCAST 的目的地。 (虽然这只会让你发送一对数字,而不是“字符串”)

      mailslot 更复杂,但专为此目的而设计。

      另一方面,邮件槽是一个进程向多个进程广播消息的一种简单方法

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多