/// <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实时通信的更多相关文章

  1. 【SignalR全套系列】之在.Net Core 中实现SignalR实时通信

    ​ 微信公众号:趣编程ACE 关注可了解更多的.NET日常实战开发技巧,如需源码 请公众号后台留言 源码 [如果觉得本公众号对您有帮助,欢迎关注] 前文回顾 [SignalR全套系列]之在.NetCo ...

  2. 在.net core3.0中使用SignalR实现实时通信

    最近用.net core3.0重构网站,老大想做个站内信功能,就是有些耗时的后台任务的结果需要推送给用户.一开始我想简单点,客户端每隔1分钟调用一下我的接口,看看是不是有新消息,有的话就告诉用户有新推 ...

  3. 壹佰文章最全总结| 《关于ASP.NETCore的分享之路》

    学习路线图 (关于学习ASP.NET Core需要了解和掌握的知识点图) 一言不合就来图,各位博客园小伙伴大家好,感觉好久没有写文章了,自从春节开始,中间经历种种,慢慢的就开始微信公众号发文了,原因有 ...

  4. 基于.NetCore开发博客项目 StarBlog - (3) 模型设计

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  5. 实现服务器端与客户端的高频实时通信 SignalR(2)

    说明:本篇文章与上篇文章 实现服务器端与客户端的实时通信 SignalR(1) 基本代码类似,只是做了些处理 高频 的改动. 一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) ...

  6. SignalR实现服务器与客户端的实时通信

    百度百科给它的定义 实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的. WebSockets是HTML5提供的新的API,可以 ...

  7. 一步一步学习SignalR进行实时通信_1_简单介绍

    一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...

  8. 一步一步学习SignalR进行实时通信_8_案例2

    原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...

  9. 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序

    原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...

随机推荐

  1. [原创] PHP 使用Redis实现锁

    目录 锁实现的注意点 加锁 connect 与 pconnect 解锁 Redis 中使用 Lua 脚本的注意点 Redis集群分布式锁 RedLock 算法 锁实现的注意点 互斥: 任意时刻, 只能 ...

  2. jinja url_for js 参数

    在JavaScript中,也就是客户端,向flask路由服务器端使用post请求并在url_for中传递参数,服务器端获取不到该参数, Jinja不能使用Javascript变量,如下所示: var ...

  3. jmeter之beanshell断言---数据处理

    在做接口测试时,对响应数据的校验是非常重要的部分:在使用Jmeter进行接口测试时,有多种respone校验方式,比如响应断言.BeanShell断言等等,BeanShell断言可以自定义断言,自由灵 ...

  4. 一种很有意思的数据结构:Bitmap

    昨晚遇到了一种很有意思的数据结构,Bitmap. Bitmap,准确来说是基于位的映射.其中每个元素均为布尔型(0 or 1),初始均为 false(0).位图可以动态地表示由一组无符号整数构成的集合 ...

  5. webpack/gulp的z-index被改写

    webpack方法 new OptimizeCSSPlugin({ cssProcessorOptions: { safe: true } }) gulp-cssnano 方法 .pipe(cssna ...

  6. [转] CentOS7 用 kubeadm 快速安装 Kubernetes v1.13.4 最新教程

    [转 + 编辑][From] https://www.jianshu.com/p/4d61f18bc62d  , https://www.jianshu.com/p/5ff6e26d1912 时间是2 ...

  7. Mac OS X中Launchpad的图标添加删除方法(添加方法别试了,和Linux很大区别)

    说明:在Mac下的Launchpad图标添加和删除都与应用程序的app文件有关,如果单纯的只想在Launchpad添加自定义的图标,然后指定要某条命令运行时,建议不要这么干,Launchpad的图标管 ...

  8. PHP在 win7 64位 旗舰版 报错 Call to undefined function curl_init()

    代码在ubuntu下无缝运行OK 转到我的win7 64位 期间 学习机上 报错: Call to undefined function curl_init() 因为用到curl 远程抓取数据. 所以 ...

  9. solr集群的搭建教程和使用入门

    1 什么是SolrCloud? SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud. 当一个系统的索引数据量少的时候 ...

  10. java 位运算符,逻辑运算符

    逻辑运算符;布尔值时使用 a=true;b=false &: 逻辑或   例:a & b=false; |: 逻辑与   例:a | b=true; !:逻辑非    例:!a=fal ...