当前位置: 首页 > news >正文

使用Service Bus Topic 实现简单的聊天室

创建Service Bus可以参照:

https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/



Azure Service Bus做广播和消息通知功能很合适,并且可以订阅不同的Topic(不同的消息类型或不同的聊天室)。



1. 首先需要安装Azure Service Bus的nuget package:





2. 建议安装Azure Service Explorer来查看Service bus中创建的Q或者Topic(本文主要介绍Topic)


https://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a


很好用,并且开源,可以学习。




3. 实现过程


3.1 首先创建1个Winform程序,拖两个button和两个Textbox,界面如下:





3.2 创建1个类,叫ChatClient:


   
public class ChatClient
    {
        private string ConnStr
        {
            get
            {
                return CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
            }
        }


        private const string topicName = "TestTopic";
        public OnMsgRecieved OnMsgRecieved;


        public void Subscribe(string subscriber)
        {
            var td = new TopicDescription(topicName)
            {
                MaxSizeInMegabytes = 5120,
                DefaultMessageTimeToLive = new TimeSpan(0, 1, 0)
            };


            // Create a new Topic with custom settings
            string connectionString =
                CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");


            var namespaceManager =
                NamespaceManager.CreateFromConnectionString(connectionString);


            if (!namespaceManager.TopicExists(topicName))
            {
                namespaceManager.CreateTopic(td);
            }


            if (!namespaceManager.SubscriptionExists(topicName, subscriber))
            {
                namespaceManager.CreateSubscription(topicName, subscriber);
            }




            SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString
            (ConnStr, topicName, subscriber, ReceiveMode.PeekLock);


            // Configure the callback options
            OnMessageOptions options = new OnMessageOptions();
            options.AutoComplete = false;
            options.AutoRenewTimeout = TimeSpan.FromMinutes(1);


            Task.Run(() =>
            {
                Client.OnMessage((message) =>
                {
                    try
                    {
                        // Process message from subscription
                        OnMsgRecieved(string.Format("{0}:{1}",
                            message.Properties["name"], message.GetBody<string>()));
                    }
                    catch (Exception)
                    {
                        // Indicates a problem, unlock message in subscription
                        message.Abandon();
                    }
                }, options);
            });


        }


        private TopicClient _topicClient;


        public TopicClient TopicClient
        {
            get
            {
                if (_topicClient == null)
                {
                    _topicClient = TopicClient.CreateFromConnectionString(ConnStr, topicName);
                }


                return _topicClient;
            }
        }


        public void SendMsg(string name, string msg)
        {
            var message = new BrokeredMessage(msg);
            message.Properties["name"] = name;
            TopicClient.Send(message);
        }




    }






1. 代码包含了Subscribe和SendMsg两个方法,注意name用于标识客户端的,如果两个客户端给一样的名字,只有客户端1个客户端能收到消息。


2. 我Hard Code了Topic名称,如果需要实现多种消息广播,给不同的名字就可以了


3. 这行代码:


SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString
            (ConnStr, topicName, subscriber, ReceiveMode.PeekLock);




中的ReceiveMode包含两种:PeekLock和ReceiveAndDelete ,前者加锁拿消息放回,后者拿消息并删除。


4. TopicClient不必每次都创建,是支持多线程环境的。


5. 
var td = new TopicDescription(topicName)
            {
                MaxSizeInMegabytes = 5120,
                DefaultMessageTimeToLive = new TimeSpan(0, 1, 0)
            };


这里设置了消息的最大长度和默认生命周期,可根据场景进行配置。




Winform的UI逻辑代码相对简单:


 
 public partial class Form1 : Form
    {
        ChatClient cc = new ChatClient();


        public Form1()
        {
            InitializeComponent();
            cc.OnMsgRecieved = (msg) =>
            {
                SetText(msg);
            };
        }


        private void btnSend_Click(object sender, EventArgs e)
        {
            cc.SendMsg(txtName.Text, txtMsg.Text);
        }




        delegate void SetTextCallback(string text);


        private void SetText(string text)
        {
            if (txtResult.InvokeRequired)
            {
                var d = new SetTextCallback(SetText);
                Invoke(d, new object[] { text });
            }
            else
            {
                txtResult.Text += "\r\n" + text;
            }
        }


        private void btnSaveName_Click(object sender, EventArgs e)
        {
            cc.Subscribe(txtName.Text);
        }
    }



逻辑很简单,点击SaveName,重新订阅。点Send按钮,发送消息。


需要注意的就是跨线程访问UI控件,这里你需要一个delegate。


实现截图:





相关文章:

  • 使用Service Bus + SignalR 实现聊天室
  • 中移动OMS系统展望..
  • Asp.net MVC4 + signalR 聊天室实现
  • JSF的国际化
  • javascript 替换浏览器Tab的title实现消息通知提示
  • 很好很强大 中移动OMS开源操作系统使用感想
  • [Windows编程] 获取系统CPU 个数
  • 算法练习之DP 求LCM (最长公共子序列)
  • C#中的特性Attribute
  • 算法练习 -- DP 查找和为指定数字的数组
  • 2009英雄会后记:最出彩是创业 最关注是产品 最可惜是创富
  • 算法练习--- DP 求解最长上升子序列(LIS)
  • Bellman ford 最短路径算法
  • ArcGIS Server Java ADF 案例教程 14
  • 扩展MongoDB C# Driver的QueryBuilder
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • “大数据应用场景”之隔壁老王(连载四)
  • 2019年如何成为全栈工程师?
  • Consul Config 使用Git做版本控制的实现
  • ES6--对象的扩展
  • gops —— Go 程序诊断分析工具
  • markdown编辑器简评
  • PV统计优化设计
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • scala基础语法(二)
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • spring boot下thymeleaf全局静态变量配置
  • Terraform入门 - 3. 变更基础设施
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Windows Containers 大冒险: 容器网络
  • 关于extract.autodesk.io的一些说明
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 小程序开发之路(一)
  • 用Visual Studio开发以太坊智能合约
  • Spring第一个helloWorld
  • ​Linux·i2c驱动架构​
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (九十四)函数和二维数组
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)用.Net的File控件上传文件的解决方案
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 连接数据库,通过数据库生成Modell
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET单元测试
  • .Net接口调试与案例
  • .Net中间语言BeforeFieldInit