Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
《Windows Azure Platform 系列文章目录》
项目文件,请在这里下载
在笔者之前的文章中Windows Azure Service Bus (1) 基础
介绍了Service Bus支持主题(Topic)。如下图:
当2个客户端同时订阅了相同的主题(Topic)。当向这个Topic发送消息的时候,2个客户端会同时收到该消息。
笔者模拟一个在线聊天室的场景:
1.创建一个Windows Console命令行项目,编写相应的代码
2.运行项目,要求输入聊天室名称(即订阅了相同的主题Topic)
3.当2个客户端进入同一个聊天室的时候,彼此之间可以互相通信和收发消息
4.当第3个客户端进入另外一个客户端的时候,不可以收到之前2个客户端发来的消息
1.创建Windows Console项目,命名为ServiceBusScribe。图略。
2.增加新的类ChatRoom.cs,增加如下代码:
using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ServiceBusScribe {class TextEventArgs :EventArgs{public ChatText ChatText{get; private set;}public TextEventArgs (ChatText chatText){ChatText = chatText;}}class ChatRoom{public event EventHandler<TextEventArgs> TextReceived;public string Name { get; private set; }TopicClient mTopicClient;SubscriptionClient mSubscriptionClient;//your servicebus namespace hereconst string mConString = "Endpoint=sb://[YourServiceBusName].servicebus.chinacloudapi.cn/;SharedAccessKeyName=[YourServiceBusKey]";public ChatRoom(string chatRoom, string userName){Name = chatRoom;NamespaceManager nm = NamespaceManager.CreateFromConnectionString(mConString);TopicDescription desc = new TopicDescription(chatRoom);desc.AutoDeleteOnIdle = TimeSpan.FromMinutes(10);if (!nm.TopicExists(chatRoom))//如果没有该Topic,则创建 nm.CreateTopic(chatRoom);if (!nm.SubscriptionExists(chatRoom, userName))//如果有该Topic,则订阅 nm.CreateSubscription(chatRoom, userName);mTopicClient = TopicClient.CreateFromConnectionString(mConString, chatRoom);mSubscriptionClient = SubscriptionClient.CreateFromConnectionString(mConString, chatRoom, userName);mSubscriptionClient.OnMessage((m) =>{var text = m.GetBody<ChatText>();if (TextReceived != null)TextReceived(this, new TextEventArgs(text));});}public void Send(string user, int color, string text){mTopicClient.Send(new BrokeredMessage(new ChatText(user, color, text)));}public void Close(){mSubscriptionClient.Close();mTopicClient.Close();}} }
注意:在上面的代码中,修改const string mConString参数,将连接字符串修改为我们自己的Service Bus连接字符串
核心代码为上面的构造函数Public ChatRoom中
3.增加新的类ChatText.cs,增加如下代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization;namespace ServiceBusScribe {[DataContract]class ChatText{[DataMember]public string User { get; set; }[DataMember]public string Text { get; set; }[DataMember]public int Color { get; set; }public ChatText(string user, int color, string text){User = user;Text = text;Color = color;}}}
4.修改Program.cs,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;using System.Runtime.Serialization;namespace ServiceBusScribe {class Program{static int linePos = 2; //当前显示行的位置static int myColor = 1; //为用户随机指定的颜色static Array mColors = Enum.GetValues(typeof(ConsoleColor));static void Main(string[] args){Random rand = new Random();myColor = rand.Next(0, mColors.Length); //随机指定用户名颜色 Console.Clear();Console.Write("请输入用户名:");string userName = Console.ReadLine();//输入新聊天室名,或者加入已有聊天室Console.Write("请输入聊天室名:");string chatRoom = Console.ReadLine();//聊天室界面 Console.Clear();Console.Write(userName);Console.SetCursorPosition(Console.WindowWidth - chatRoom.Length, 0);Console.Write(chatRoom);Console.Write(new String('*', Console.WindowWidth));Console.SetCursorPosition(0, Console.WindowHeight - 4);Console.Write(new String('*', Console.WindowWidth));ChatRoom room = new ChatRoom(chatRoom, userName);room.TextReceived += room_TextReceived;while (true){setCursorAtBottom();var input = Console.ReadLine();if (string.IsNullOrEmpty(input))break;room.Send(userName, myColor, input);}room.Close();}static void setCursorAtBottom(){ //这个方法把光标放在屏幕底部,供用户输入新信息Console.SetCursorPosition(0, Console.WindowHeight - 3);Console.Write(new String(' ', Console.WindowWidth));Console.SetCursorPosition(0, Console.WindowHeight - 3);Console.Write("] ");}static void room_TextReceived(object sender, TextEventArgs e){if (linePos >= Console.WindowHeight - 4){for (int i = 2; i < Console.WindowHeight - 4; i++){Console.SetCursorPosition(0, i);Console.Write(new string(' ', Console.WindowWidth));}linePos = 2;}//显示接受到的新消息Console.SetCursorPosition(0, linePos);Console.ForegroundColor = (ConsoleColor)mColors.GetValue(e.ChatText.Color);Console.Write("[" + e.ChatText.User + "]:");Console.ForegroundColor = ConsoleColor.White;Console.Write(e.ChatText.Text);linePos++;setCursorAtBottom();}} }
5.项目创建完毕后,记得增加对Microsoft.ServiceBus命名空间的引用。
然后我们编译一下,并同时运行2个Windows Console实例。
首先输入不同的用户名。
然后再输入同样的聊天室名称,如下图的Game。
我们进入同一个聊天室,显示如下:
我们在左侧,以Jack身份输入Hello信息后。即可在两个聊天室窗口,同时看到聊天信息。如下图:
同样的道路,我们在右侧的聊天窗口中,以Tom身份输入信息,也可以在两个聊天室窗口,同时看到聊天信息。
6.最后,我们可以在Azure Management Portal,查看到我们创建的名为Game的Service Bus Topic,如下图:
上图中,Game是笔者创建的聊天室名称。
另外,我们在不关闭2个Windows Console窗口的情况下,可以看到Subscription Count为2。即2个客户端订阅了该Topic。
参考文档:
《Windows Azure实战》——(美)白海石,机械工业出版社
Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic相关推荐
- Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue
<Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...
- Windows Azure HandBook (5) Azure混合云解决方案
<Windows Azure Platform 系列文章目录> 在很多情况下,我们都会遇到本地私有云和公有云做互通互联的混合云场景.对于这种混合云的场景,微软的Windows Azure会 ...
- Windows Azure实战pdf
下载地址:网盘下载 内容简介 · · · · · · 本书应该是当下Windows Azure领域最具权威性.完整性和实用性,同时也是最与时俱进(结合最新技术)的书籍之一,由微软官方资深云计算专家撰 ...
- Windows Azure Mobile Services增加了对 Android的支持并扩展其适用范围至东亚地区
我们的Mobile Services使开发人员很容易地开发丰富多彩的移动应用程序.使用Mobile Services ,开发人员不仅能够连接其应用程序到 Windows Azure 上易扩展又安全的后 ...
- 在Windows Azure中使用自己的域名
请参考:http://blog.smarx.com/posts/custom-domain-names-in-windows-azure 本文是对这篇文章部分解释和补充. 并请记住,此博客总是能给你在 ...
- 微软云之路——Windows Azure 学习
今天参与了灵通公司举办的微软云之路Windows Azure的培训,主要讲了Windows Azure提供的PaaS服务. 云端提供开发平台和服务器资源.具体先在云端建立host机,数据库账户.再在本 ...
- Windows Azure服务购买,收费,使用注意事项及学习资料推荐
Windows Azure服务购买,收费,使用注意事项及学习资料推荐 近来,QQ群里不少朋友比较关注Windows Azure,然而又仿佛不知道怎么入手.怎么开始开发,部署这些是技术细节,相信难不倒大 ...
- 现实世界的 Windows Azure:HRG将应用程序扩展到移动设备,削减80 %的启动成本
作为现实世界 Windows Azure 系列的一部分,我们联系了Hogg Robinson Group (HRG)的技术和产品开发主任Paul Saggar, 了解关于如何如何在Windows Az ...
- Windows Azure案例:迈阿密市政府使用“云”平台改善服务方案,降低运营成本
公告 :本博客为微软云计算中文博客 的镜像博客. 部分文章因为博客兼容性问题 ,会影响阅读体验 .如遇此情况,请访问 原博客 . 市政府使用"云"改善服务方案,降低成本 迈 ...
最新文章
- Spring 容器的启动过程
- java 外部接口调用 设计模式_《Java设计模式》之接口模式
- 安卓camera总体框架
- 广西全国计算机二级考试内容,全国高校计算机等级考试(广西考区)二级考试大纲.doc...
- java pollfirst_Java BlockingDeque pollFirst()用法及代码示例
- JDBC--调用函数与存储过程
- 指针的指针(二级指针)本质
- Windows下VB6.0开发——关于String类型数据的思考
- 1个app的完整测试用例_同你分享1个完整的聚类分析案例
- 全球IP将告罄,美国已摇号限购
- python selenium+Firefox 模拟浏览器操作
- BeautifulSoup 根据输入的公司名称来爬取公司的详细信息(2022-08-24更新版)
- 2D 横向对抗射击游戏之美
- katago安装使用
- python爬取凤凰新闻网_python凤凰新闻数据分析(一)python爬虫数据爬取
- 本地项目关联远程 git 仓库
- 专业系统维护:CleanMyMac X for mac
- 使用HTTPie测试Web服务
- VS2010e rror LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 华为上交 | GAN 将古典人像变3D,视角可切换
热门文章
- eclipse中 properties文件编码问题
- Java配置环境变量及其意义
- Android开源测试框架
- sql loader 导入数据时的问题
- tomcat安装及使用详解
- P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
- Android如何使用so文件和Android studio中导入so
- HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned
- Working with Symbols (在Balsamiq Mockups中复用自定义控件和页面模板)
- C#资源释放及Dispose、Close和析构方法