使用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用于标识client的。假设两个client给一样的名字,仅仅有client1个client能收到消息。

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);
        }
    }

逻辑非常easy,点击SaveName。又一次订阅。点Send按钮,发送消息。

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

实现截图:

时间: 2024-11-10 07:04:29

使用Service Bus Topic 实现简单的聊天室的相关文章

Windows Azure Service Bus (4) 主题(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

玩转Node.js(四)-搭建简单的聊天室

玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一些个教程使用它来搭建一个超级简单的聊天室. 初始化项目 在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化: $ npm init 然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下: 1 $ ca

Java网络编程 - 基于UDP协议 实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理. "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: 将客户端的信息(进入了哪一个聊

简单的聊天室制作

简单的聊天室制作 一个简单的聊天室,主要是就两个部分,一部分就是我们进行的时候那个聊天窗口,另外一个就是背后的服务器,我们要写一个聊天窗口,也要写一个相对应的服务器. 做一个项目过程中,写一个代码很简单,但是把逻辑分析清楚,将制作的过程中所有的逻辑关系分析清楚是项目的最重要的环节. 下面的一步一步,将这个聊天室的制作过程一步一步制作出来. 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 第八步: 第九步: 第十步: 第十一步: 这就是简单的聊天室的制作的过程.这样我们来看一

基于Server-Sent Event的简单在线聊天室

一.Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时如果有人回答了我们的问题,知乎就会即时提醒我们,再比如现在电子商务的在线客服功能.这些能大大提高用户体验的功能都是基于Web即时通信实现的. 普通HTTP流程 客户端从服务器端请求网页 服务器作出相应的反应 服务器返回相应到客户端 而由于HTTP请求是无状态的,也就是说每次请求完成后,HTTP链

Android开发之简单的聊天室(客户端与服务器进行通信)

1.使用ServerSocket创建TCP服务器端 Java中能接收其他通信实体连接请求的类是ServerSocket, ServerSocket对象用于监听来 自客户端的Socket连接,如果没有连接,它将一直处于等待状态.ServerSocket包含一个监听来自客户端连接请求的方法. 1) Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞. 创建ServerSoc

WebSocket介绍和一个简单的聊天室

WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范,WebSocketAPI被W3C定为标准. WebSocket 是独立的.创建在 TCP 上的协议,和 HTTP 的唯一关联是使用 HTTP 协议的101状态码进行协议切换,使用的 TCP 端口是80,可以用于绕过大多数防火墙的限制. WebSocket 使得客户端和服务器之间的数据交换变得更加简单

node实现一个简单的聊天室(认识一下socket)

边学边理解node的高深,今天写了一个聊天室的demo,很简单,认识一下socket node服务端代码 var express = require('express'); var app = express();//session固定写法 var session = require('express-session'); app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true })); /

JAVA WebSocKet ( 简单的聊天室 )

1, 前端代码 登入页 -> login.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>聊天室登入接口</title> <script type="text/javascript" src="JavaScript/jQuery.js"></script> <