使用多个接收器广播消息

时间:2012-05-31 08:04:38

标签: c# tcp udp message msmq

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

每当有一个随机数量的表单接收到该消息但收到的消息时,其他表单将不再接收该消息。

我已尝试使用UDP,TCP IP,MSMQ,但我似乎并没有让它运行良好。发送方和接收方在同一系统上运行。

任何人都可以推荐我一种方式来广播一种消息,这种消息一直保留在一个队列中,直到所有表单都收到它,或者它可以保留在队列中直到应用程序关闭,但是如何......?

先谢谢大家!

亲切的问候 韦斯利

2 个答案:

答案 0 :(得分:5)

组播MSMQ

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

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

接收机

读者必须有一个私人队列,然后你需要设置你想要使用的多播地址(多播地址的选择是任意的,这就是为什么你经常会看到不同帖子中提到的相同地址,见有关更多信息的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();

委托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!");

答案 1 :(得分:2)

您要查找的消息传递模式称为publish-subscribe。 MSMQ本身不支持此消息传递模式。

但是,有许多开源工具可以包括RabbitMQNServiceBus