使用多个接收器进行消息广播
本文关键字:消息 广播 接收器 | 更新日期: 2023-09-27 18:35:46
>我有一个发送消息的主窗体和作为单独应用程序运行的随机数量的接收窗体(C# 4.0)。
每次随机数量的表单中的一个收到消息,但收到消息时,其他人将不再收到它。
我已经用UDP,TCP IP,MSMQ尝试过这个,但我似乎不能很好地工作。发送方和接收方在同一系统上运行。
谁能向我推荐一种方法来广播一条消息,该消息一直保留在某种队列中,直到所有表单都收到它,或者它可以保留在该队列中直到应用程序关闭,但是如何......?
提前感谢人们!
亲切问候韦斯利
多播 MSMQ
您可以将MSMQ与多播选项一起使用(在尝试之前检查您的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!");
您正在寻找的消息传递模式称为发布-订阅。MSMQ 本身不支持此消息传递模式。
但是,有许多开源工具可以做到,包括RabbitMQ和NServiceBus。