《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相关推荐

  1. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue

    <Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...

  2. Windows Azure HandBook (5) Azure混合云解决方案

    <Windows Azure Platform 系列文章目录> 在很多情况下,我们都会遇到本地私有云和公有云做互通互联的混合云场景.对于这种混合云的场景,微软的Windows Azure会 ...

  3. Windows Azure实战pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书应该是当下Windows Azure领域最具权威性.完整性和实用性,同时也是最与时俱进(结合最新技术)的书籍之一,由微软官方资深云计算专家撰 ...

  4. Windows Azure Mobile Services增加了对 Android的支持并扩展其适用范围至东亚地区

    我们的Mobile Services使开发人员很容易地开发丰富多彩的移动应用程序.使用Mobile Services ,开发人员不仅能够连接其应用程序到 Windows Azure 上易扩展又安全的后 ...

  5. 在Windows Azure中使用自己的域名

    请参考:http://blog.smarx.com/posts/custom-domain-names-in-windows-azure 本文是对这篇文章部分解释和补充. 并请记住,此博客总是能给你在 ...

  6. 微软云之路——Windows Azure 学习

    今天参与了灵通公司举办的微软云之路Windows Azure的培训,主要讲了Windows Azure提供的PaaS服务. 云端提供开发平台和服务器资源.具体先在云端建立host机,数据库账户.再在本 ...

  7. Windows Azure服务购买,收费,使用注意事项及学习资料推荐

    Windows Azure服务购买,收费,使用注意事项及学习资料推荐 近来,QQ群里不少朋友比较关注Windows Azure,然而又仿佛不知道怎么入手.怎么开始开发,部署这些是技术细节,相信难不倒大 ...

  8. 现实世界的 Windows Azure:HRG将应用程序扩展到移动设备,削减80 %的启动成本

    作为现实世界 Windows Azure 系列的一部分,我们联系了Hogg Robinson Group (HRG)的技术和产品开发主任Paul Saggar, 了解关于如何如何在Windows Az ...

  9. Windows Azure案例:迈阿密市政府使用“云”平台改善服务方案,降低运营成本

    公告   :本博客为微软云计算中文博客 的镜像博客. 部分文章因为博客兼容性问题 ,会影响阅读体验 .如遇此情况,请访问 原博客   . 市政府使用"云"改善服务方案,降低成本 迈 ...

最新文章

  1. Spring 容器的启动过程
  2. java 外部接口调用 设计模式_《Java设计模式》之接口模式
  3. 安卓camera总体框架
  4. 广西全国计算机二级考试内容,全国高校计算机等级考试(广西考区)二级考试大纲.doc...
  5. java pollfirst_Java BlockingDeque pollFirst()用法及代码示例
  6. JDBC--调用函数与存储过程
  7. 指针的指针(二级指针)本质
  8. Windows下VB6.0开发——关于String类型数据的思考
  9. 1个app的完整测试用例_同你分享1个完整的聚类分析案例
  10. 全球IP将告罄,美国已摇号限购
  11. python selenium+Firefox 模拟浏览器操作
  12. BeautifulSoup 根据输入的公司名称来爬取公司的详细信息(2022-08-24更新版)
  13. 2D 横向对抗射击游戏之美
  14. katago安装使用
  15. python爬取凤凰新闻网_python凤凰新闻数据分析(一)python爬虫数据爬取
  16. 本地项目关联远程 git 仓库
  17. 专业系统维护:CleanMyMac X for mac
  18. 使用HTTPie测试Web服务
  19. VS2010e rror LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  20. 华为上交 | GAN 将古典人像变3D,视角可切换

热门文章

  1. eclipse中 properties文件编码问题
  2. Java配置环境变量及其意义
  3. Android开源测试框架
  4. sql loader 导入数据时的问题
  5. tomcat安装及使用详解
  6. P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
  7. Android如何使用so文件和Android studio中导入so
  8. HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned
  9. Working with Symbols (在Balsamiq Mockups中复用自定义控件和页面模板)
  10. C#资源释放及Dispose、Close和析构方法