NetMQ 发布订阅模式 Publisher-Subscriber
第一部分引用于:点击打开
1:简单介绍
PUB-SUB模式一般处理的都不是系统的关键数据。发布者不关注订阅者是否收到发布的消息,订阅者也不知道自己是否收到了发布者发出的所有消息。你也不知道订阅者何时开始收到消息。类似于广播,收音机。因此逻辑上,它都不是可靠的。这个可以通过与请求响应模型组合来解决。
图1:简单的发布订阅模式
图2:与请求响应模式组合的发布订阅模式
2:案例
定义IPublishser接口
Publisher实现类
namespace NetMQDemoPublisher { public class Publisher:IPublisher { private object _lockObject = new object(); private PublisherSocket _publisherSocket; public Publisher(string endPoint) { _publisherSocket = new PublisherSocket(); _publisherSocket.Options.SendHighWatermark = 1000; _publisherSocket.Bind(endPoint); } #region Implementation of IDisposable /// <summary> /// 执行与释放或重置非托管资源相关的应用程序定义的任务。 /// </summary> public void Dispose() { lock (_lockObject) { _publisherSocket.Close(); _publisherSocket.Dispose(); } } /// <summary> /// 发布消息 /// </summary> /// <param name="topicName">主题</param> /// <param name="data">内容</param> public void Publish(string topicName, string data) { lock (_lockObject) { _publisherSocket.SendMoreFrame(topicName).SendFrame(data); } } #endregion } }
Publisher窗口界面
界面中实现的功能代码
定义ISubscriber接口
Subscriber实现类
Subscriber窗口界面
窗体功能代码
namespace NetMQDemoSubscriber { public partial class SubscriberForm : Form { private ISubscriber subscriber; public SubscriberForm() { InitializeComponent(); } private void SubscriberForm_Load(object sender, EventArgs e) { subscriber = new Subscriber("tcp://127.0.0.1:8888"); subscriber.RegisterSbuscriberAll(); subscriber.Nofity+= delegate(string s, string s1) { ListViewItem item = new ListViewItem(string.Format("topic:{0},Data:{1}", s, s1)); listView1.Items.Add(item); }; } } }
运行后,Publiser开启一个,Subscirber开启三个,进行测试如图
如果觉得文章好,记得关注一下公众号哟!