c# - 多个接收者的消息广播

标签 c# tcp udp message msmq

我有一个发送消息的主窗体和作为单独应用程序运行的随机数量的接收窗体 (C# 4.0)。

每次随机数量的表单中有一个收到消息,但收到消息后其他人将不再收到。

我已经尝试过使用 UDP、TCP IP、MSMQ 进行此操作,但似乎效果不佳。发送方和接收方在同一系统上运行。

任何人都可以向我推荐一种方法来广播一条消息,该消息会一直保持在某种队列中,直到所有表单都收到它,或者它可能会一直保持在该队列中直到应用程序关闭,但是如何...?

在此先感谢大家!

亲切的问候 卫斯理

最佳答案

多播MSMQ

您可以使用 MSMQ with Multicast 选项(在尝试之前检查您的 Windows 安装是否有该选项,您可以在 Windows 控制面板的“添加/删除 Windows 功能”部分找到它) .

使用 MSMQ 多播队列的发件人将提交可由许多 MSMQ 多播队列接收者处理的消息。

接收者

读者必须有一个私有(private)队列,然后你需要设置你想使用的多播地址(多播地址的选择是任意的,这就是为什么你会经常看到在不同的帖子中提到相同的地址,见有关详细信息的 msdn 文档),如下所示:

var myQueue = MessageQueue.Create(".\private$\MulticastTest", false);
myQueue.MulticastAddress = "234.1.1.1:8001";

或者直接使用现有的多播队列(如果它是用多播地址创建的)标准方式:

var myQueue = new MessageQueue(multicastQueueName());

然后你将不得不使用你喜欢的方法来收听新消息,我更喜欢使用这个:

myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
myQueue.PeekCompleted += new PeekCompletedEventHandler(QueuePeekCompleted);
myQueue.BeginPeek();

委托(delegate) QueuePeekCompleted 看起来像这样:

     private void QueuePeekCompleted(object sender, PeekCompletedEventArgs e)
     {
        try
        {
            var message = myQueue.EndPeek(e.AsyncResult);

            //LogInfo("Received this : " + message.Body);
        }
        catch (Exception ex)
        {
            //LogError(ex);
        }
        myQueue.Receive();
        myQueue.BeginPeek();
    }

发件人

多播消息的发送者必须像这样连接到多播队列:

MessageQueue myQueue = new MessageQueue("formatname:multicast=234.1.1.1:8001");

然后照常发送消息:

myQueue.Send("hey listen!");

关于c# - 多个接收者的消息广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829632/

相关文章:

c# - 在C#中,有没有办法始终如一地获取当前焦点窗口的选定文本内容?

c# - "Out"参数(引用)与 Action<>

java - tcp 服务器的奇怪行为(使用 winsock)

node.js - socket.on 函数中未触发 Socket.get 回调

java - Java 中 UDP DatagramSocket 线程的 CPU 使用率过高

c++ - 接收客户端通过互联网发送的数据报

c# - ExecuteScript(setInterval) 完成后继续 `while` 循环

c# - 如何按自定义顺序对 list<string> 进行排序

docker - 解封80端口/nginx/docker

linux - UDP 数据包丢弃 - INErrors 与 .RcvbufErrors