使用多个接收器广播消息

Wes*_*ieu 2 c# message udp tcp msmq

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

每当随机数量的表单中的一个接收到消息,而不是接收消息而其他表单将不再接收消息.

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

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

在此先感谢大家!

亲切的问候韦斯利

Mic*_*lix 5

组播MSMQ

您可以将MSMQ与多播选项一起使用(在尝试之前检查您的Windows安装是否具有该选项,您将在Windows控制面板的"添加/删除Windows功能"部分中找到它).

使用MSMQ多播队列的发送方将提交可由许多MSMQ多播队列接收器处理的消息.

接收器

读者必须有一个私有队列,然后你需要设置你想要使用的多播地址(多播地址的选择是任意的,这就是为什么你经常会看到不同帖子中提到的相同地址,请参阅msdn docs有关更多信息),像这样:

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

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

var myQueue = new MessageQueue(multicastQueueName());
Run Code Online (Sandbox Code Playgroud)

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

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

委托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();
    }
Run Code Online (Sandbox Code Playgroud)

寄件人

多播消息的发送方必须连接到多播队列,如下所示:

MessageQueue myQueue = new MessageQueue("formatname:multicast=234.1.1.1:8001");
Run Code Online (Sandbox Code Playgroud)

然后像往常一样发送消息:

myQueue.Send("hey listen!");
Run Code Online (Sandbox Code Playgroud)