《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 here
const 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(); 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 = ; //当前显示行的位置
static int myColor = ; //为用户随机指定的颜色
static Array mColors = Enum.GetValues(typeof(ConsoleColor));
static void Main(string[] args)
{
Random rand = new Random();
myColor = rand.Next(, 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, ); Console.Write(chatRoom);
Console.Write(new String('*', Console.WindowWidth));
Console.SetCursorPosition(, Console.WindowHeight - ); 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(, Console.WindowHeight - );
Console.Write(new String(' ', Console.WindowWidth)); Console.SetCursorPosition(, Console.WindowHeight - );
Console.Write("] ");
} static void room_TextReceived(object sender, TextEventArgs e)
{
if (linePos >= Console.WindowHeight - )
{
for (int i = ; i < Console.WindowHeight - ; i++)
{
Console.SetCursorPosition(, i);
Console.Write(new string(' ', Console.WindowWidth));
}
linePos = ;
}
//显示接受到的新消息
Console.SetCursorPosition(, 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 Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On

    <Windows Azure Platform 系列文章目录> 注意:本文介绍的是国内由世纪互联运维的Windows Azure服务. 项目文件请在这里下载. 我们在使用Azure平台的时 ...

  3. Windows Azure Service Bus (4) Service Bus Queue和Storage Queue的区别

    <Windows Azure Platform 系列文章目录> 熟悉笔者文章的读者都了解,Azure提供两种不同方式的Queue消息队列: 1.Azure Storage Queue 具体 ...

  4. Windows Azure Cloud Service (11) PaaS之Web Role, Worker Role(上)

    <Windows Azure Platform 系列文章目录> 本文是对Windows Azure Platform (六) Windows Azure应用程序运行环境内容的补充. 我们知 ...

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

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

  6. 无责任Windows Azure SDK .NET开发入门篇一[Windows Azure开发前准备工作]

    一.Windows Azure开发前准备工作 首先我们需要了解什么是 Azure SDK for .NET?微软官方告诉我们:Azure SDK for .NET 是一套应用程序,其中包括 Visua ...

  7. Windows Azure 安全最佳实践 - 第 3 部分:确定安全框架

    构建云应用程序时,安全始终是计划和执行Windows Azure的首要核心因素.第 1 部分提出安全是一项共同责任,Windows Azure为您的应用程序提供超出内部部署应用程序需求的强大安全功能. ...

  8. 无责任Windows Azure SDK .NET开发入门篇(一):开发前准备工作

    Windows Azure开发前准备工作 什么是 Azure SDK for .NET?微软官方告诉我们:Azure SDK for .NET 是一套应用程序,其中包括 Visual Studio 工 ...

  9. [Windows Azure] Developing Multi-Tenant Web Applications with Windows Azure AD

    Developing Multi-Tenant Web Applications with Windows Azure AD 2 out of 3 rated this helpful - Rate ...

随机推荐

  1. JS中json数据的处理

    1.  json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12}; json数组: ...

  2. 如何向MyEclipse项目的文件夹中添加JSP页面?

    1.鼠标选中该文件夹:2.鼠标右键单击该文件夹,选择“new->file”菜单项,创建一个空白文件:3.将JSP页面的所有源代码全部复制到该文件4.单击工具栏的“保存”按钮

  3. Cron表达式备忘

    Cron表达式(在Quartz.net里面会用到) 由7段构成:秒 分 时 日 月 星期 年(可选)"-" :表示范围  MON-WED表示星期一到星期三"," ...

  4. FFmpeg 2.1 发布

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它包括了目前领先的音/视频编码库 libavcodec. FFmpeg是在Linux下开发出来的,但它可以在包括W ...

  5. 【Bugly干货分享】手把手教你逆向分析 Android 程序

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...

  6. DeviceOne 竟然做出来如此复杂的App

    分享来自DeviceOne论坛 此文章分享自DeviceOne的论坛,论坛上的用户分享,下面有二维码扫描,可以进行安装和试用.支持android和ios两个 操作系统. 这个还没做完,目前已经完成了初 ...

  7. SpeechLib 语音播报

    SpeechLib这的dll专门用来播放语音,能够识别英语.简体和繁体.并且可以播放声音文件,支持WAV格式,但不支持MP3.在报警场合下已经够用了. 基本播放语音及文件.支持异步. using Sy ...

  8. 定时关闭AWS上的EC2机器实例

    最近一段时间在做一个产品从阿里云向亚马逊云中国区迁移的前期试验.亚马逊中国区并没有开放免费体验账号,使用的每一份资源都要实打实的掏钱.而为了实验我们使用时一般要启动好几台EC2实例.为了不浪费辛辛苦苦 ...

  9. okhttp教程——起步篇

    okhttp教程--起步篇 这篇文章主要总结Android著名网络框架-okhttp的基础使用,后续可能会有关于他的高级使用. okhttp是什么 okhttp是Android端的一个Http客户端, ...

  10. 我心中的核心组件(可插拔的AOP)~分布式文件上传组件~基于FastDFS

    回到目录 一些概念 在大叔框架里总觉得缺点什么,在最近的项目开发中,终于知道缺什么了,分布式文件存储组件,就是缺它,呵呵,对于分布式文件存储来说,业界比较公认的是FastDFS组件,它自己本身就是集群 ...