/// <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. 【转载】Java 9 新特性——模块化

    来自 <http://www.jianshu.com/p/053a5ca89bbb#> 前言 年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪 ...

  2. Spring注入方式(1)

    Spring支持3种依赖注入方式,分别为属性注入.构造器注入和工厂方法注入(很少使用,不推荐),下面分别对属性注入和构造器注入详细讲解. 1.常量注入 属性注入是通过setter方法注入Bean的属性 ...

  3. 开发基于vue前端框架下的系统的UI自动化,记录总结踩的坑

    在使用了pytest完成了一个系统的UI自动化后,因为系统的前端框架,是 基于VUE写的,这就让我编写脚本的时候踩了些坑. 无法用JS 修改标签属性,从而进行的操作 比如上传图片,我们的上传是这样子的 ...

  4. [原创]PHP使用Redis实现Session共享

    目录 前言 设计方案 1. 通过php自身session配置实现 2. 设置用户自定义会话存储函数 前言 小型web服务, session数据基本是保存在本地(更多是本地磁盘文件), 但是当部署多台服 ...

  5. net 反编译神器

    文章地址:https://www.cnblogs.com/sheng-jie/p/10168411.html dnSpy官网下载  分享链接 .net core源码导航 https://www.cnb ...

  6. [性能测试]:关于消费类ISO8583协议脚本的开发

    一,要发送的报文,转化成16进制的,报文如下 "\x01\x52"//报文长度338 "\x60\x00\x24\x00\x00"//TPDU "\x ...

  7. [转] HBase异常:hbase-default.xml file seems to be for an old version of HBase

    [From] https://blog.yoodb.com/yoodb/article/detail/157 使用HBase Java Client连接HBase服务端创建Configuration对 ...

  8. (转)搞个这样的APP要多久?心酸啊。

    这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...

  9. EasyMock set方法报错: java.lang.AssertionError

    有返回值的方法没问题, 直接andReturn就行了. EasyMock.expect(info.getWebTitle()).andReturn(StringUtils.EMPTY).anyTime ...

  10. WPF DataTemplate與ControlTemplate

    一. 前言     什麼是DataTemplate? 什麼是ControlTemplate? 在stackoverflow有句簡短的解釋 "A DataTemplate, therefore ...