SignalR实时通信

/// <summary>
/// Message集线器类
/// </summary>
[HubName("chathub")]
public class ChatHub : Hub
{
private Broadcaster _broadcaster;
public ChatHub()
: this(Broadcaster.Instance)
{
}
public ChatHub(Broadcaster broadcaster)
{
_broadcaster = broadcaster;
}
/// <summary>
/// 给所有页面发送消息
/// </summary>
/// <param name="name"></param>
/// <param name="message"></param>
public void Send(string name, string message)
{
_broadcaster.broadcastMessage(name, message);
}
/// <summary>
/// 给指定页面发送消息
/// </summary>
/// <param name="id"></param>
/// <param name="message"></param>
public void Send(int id, string message)
{
_broadcaster.broadcastMessage(id, message);
}
[HubMethodName("connect")]
public void Connect(string id)
{
var connnectId = Context.ConnectionId;//Value
if (id != null && connnectId != null)
{
SERedisHelper.StringSet(id, connnectId, );
}
}
} public class Broadcaster
{
private readonly static Lazy<Broadcaster> _instance = new Lazy<Broadcaster>(() => new Broadcaster());
private readonly IHubContext _hubContext;
public Broadcaster()
{
_hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
}
public static Broadcaster Instance
{
get
{
return _instance.Value;
}
}
/// <summary>
/// 给所有页面发送消息
/// </summary>
/// <param name="name"></param>
/// <param name="message"></param>
public void broadcastMessage(string name, string message)
{
_hubContext.Clients.All.broadcastMessage(name, message);
}
/// <summary>
/// 给指定页面发送消息
/// </summary>
/// <param name="id"></param>
/// <param name="message"></param>
public void broadcastMessage(int id, string message)
{
string strValue = SERedisHelper.StringGet(id.ToString());
BIT.Common.Log.Debug("C# 后台 向客户端 发送消息的方法strValue:" + strValue);
if (strValue != null && strValue.Length > )
_hubContext.Clients.Client(strValue).broadcastMessage(message);
}
}
ChatHub.cs内部代码
public class Startup
{
public void Configuration(IAppBuilder app)
{
#region Redis配置
//添加redis / /任何连接或集线器连接和配置应该去这里
// Redis Server 地址 是正在运行的服务器的名称
string ServerString = "";
if (System.Configuration.ConfigurationManager.AppSettings["RedisServerString"] != null)
{
ServerString = System.Configuration.ConfigurationManager.AppSettings["RedisServerString"].ToString();
}
int port = ; // 端口
if (System.Configuration.ConfigurationManager.AppSettings["RedisServerPort"] != null)
{
int.TryParse(System.Configuration.ConfigurationManager.AppSettings["RedisServerPort"].ToString(), out port);
}
//是你的在 Redis中定义 定义配置的 密码。
string password = "";
if (System.Configuration.ConfigurationManager.AppSettings["RedisServerPassword"] != null)
{
password = System.Configuration.ConfigurationManager.AppSettings["RedisServerPassword"].ToString();
}
// SignalR创建一个 Redis,pub / sub通道具有该名称。
string appname = "";
if (System.Configuration.ConfigurationManager.AppSettings["RedisServerAppName"] != null)
{
appname = System.Configuration.ConfigurationManager.AppSettings["RedisServerAppName"].ToString();
}
RedisScaleoutConfiguration redisScaleoutConfiguration = new RedisScaleoutConfiguration(ServerString, port, password, appname);
//连接DB,默认为0
redisScaleoutConfiguration.Database = ;
//SignalR用Redis
GlobalHost.DependencyResolver.UseRedis(redisScaleoutConfiguration);
#endregion
// 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
app.MapSignalR();//启动SignalR
}
}
Startup.cs内部代码-使用redis
<appSettings>
<!--Redis配置-->
<add key="RedisServerString" value="localhost" />
<add key="RedisServerPort" value="6379" />
<add key="RedisServerPassword" value="" />
<add key="RedisServerAppName" value="chathub" />
</appSettings>
Web.config配置
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div> </form>
</body>
</html>
发送消息的页面HTML结构
protected void Button1_Click(object sender, EventArgs e)
{
Broadcaster.Instance.broadcastMessage(, "msg");
}
发送消息页面的后台代码
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div id="sss"> </div>
<asp:HiddenField ID="hfID" runat="server" value="1"/>
</form>
<script src="../Scripts/jquery-1.6.4.min.js"></script>
<script src="../Scripts/jquery.signalR-2.2.1.min.js"></script>
<script src="../signalr/hubs"></script>
<script type="text/javascript">
var i = 0;
$(function () {
$("#sss").html(i);
var chat = $.connection.chathub;
chat.client.broadcastMessage = function (message) {
i++;
$("#sss").html(i);
}; //日志输出,以备调试使用
$.connection.hub.logging = true; var id = $("#hfID").val();
$.connection.hub.start(function () {
chat.invoke("connect", id);
});
});
</script>
</body>
</html>
接收消息的页面代码




SignalR实时通信的更多相关文章
- 【SignalR全套系列】之在.Net Core 中实现SignalR实时通信
微信公众号:趣编程ACE 关注可了解更多的.NET日常实战开发技巧,如需源码 请公众号后台留言 源码 [如果觉得本公众号对您有帮助,欢迎关注] 前文回顾 [SignalR全套系列]之在.NetCo ...
- 在.net core3.0中使用SignalR实现实时通信
最近用.net core3.0重构网站,老大想做个站内信功能,就是有些耗时的后台任务的结果需要推送给用户.一开始我想简单点,客户端每隔1分钟调用一下我的接口,看看是不是有新消息,有的话就告诉用户有新推 ...
- 壹佰文章最全总结| 《关于ASP.NETCore的分享之路》
学习路线图 (关于学习ASP.NET Core需要了解和掌握的知识点图) 一言不合就来图,各位博客园小伙伴大家好,感觉好久没有写文章了,自从春节开始,中间经历种种,慢慢的就开始微信公众号发文了,原因有 ...
- 基于.NetCore开发博客项目 StarBlog - (3) 模型设计
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 实现服务器端与客户端的高频实时通信 SignalR(2)
说明:本篇文章与上篇文章 实现服务器端与客户端的实时通信 SignalR(1) 基本代码类似,只是做了些处理 高频 的改动. 一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) ...
- SignalR实现服务器与客户端的实时通信
百度百科给它的定义 实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的. WebSockets是HTML5提供的新的API,可以 ...
- 一步一步学习SignalR进行实时通信_1_简单介绍
一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...
- 一步一步学习SignalR进行实时通信_8_案例2
原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...
- 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序
原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...
随机推荐
- Java多线程——同步容器类
1.同步容器类 同步容器类包括Vector和Hashtable,是早期JDK的一部分,这些类实现的方法是:将它们的状态封装起来,并对每个共有的方法进行同步,使得每个线程只有一个线程能访问它们. 1.1 ...
- 社区发现SLPA算法
社区(community)定义:同一社区内的节点与节点之间关系紧密,而社区与社区之间的关系稀疏. 设图G=G(V,E),所谓社区发现是指在图G中确定nc(>=1)个社区C={C1,C2,..., ...
- 【Vue】环境搭建、项目创建及运行
一.软件下载 1. 进入官网https://nodejs.org/en/下周node.js,傻瓜式安装步骤(一直下一步就好) 2. 进入官网http://www.dcloud.io/下载并安装编辑器H ...
- (转)ELK原理与介绍
原文:https://www.cnblogs.com/aresxin/p/8035137.html 为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己 ...
- 再谈Hive元数据如hive_metadata与Linux里MySQL的深入区别(图文详解)
不多说,直接上干货! [bigdata@s201 conf]$ vim hive-site.xml [bigdata@s201 conf]$ pwd /soft/hive/conf [bigdata@ ...
- Hive 外部表新增字段或者修改字段类型等不生效
标题比较笼统,实际情况是: 对于Hive 的分区外部表的已有分区,在对表新增或者修改字段后,相关分区不生效. 原因是:表元数据虽然修改成功,但是分区也会对应列的元数据,这个地方不会随表的元数据修改而修 ...
- 关于delete和对象复制
本码农的惯例,开篇废话几句... 前天小生又被虐了... 没办法,作为一个资深code user,我用代码的能力,解决问题的能力自问是不弱的... 但是自身的前端基础说实话还是不过硬,最明显的表现就是 ...
- Java将Excel的列数以字母表示的字符串转换成数字表示
我们知道,在 Excel 中,行数用数字表示,而列数是用字母表示的(如下图所示),有时候需要把它转换成数字来使用,或者把数字转换成字母.(例如使用POI操作Excel) 下面是转换代码,用来进行字母和 ...
- OpenStack概述
OpenStack OpenStack is a cloud operating system that controls large pools of compute, storage, and n ...
- jsonp全国天气案例
案例1: 1.获取跨域数据 2.将数据按照下面的效果放到body里面 key: f49570d39b02b3c203526b5d8255aa61 079179afb105ce2bae9f5d0 ...