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 ...
随机推荐
- OKR 第一阶段
性能优化,主要是为了提高用户体验. 1. 根据浏览器的工作原理,dom树解析时,遇到css 以及js 会出现阻塞,为了缩短dom树解析时间,进行了js 增加 async 的异步加载过程 . 原有代 ...
- POJ 2209
#include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> #d ...
- python学习,day4:装饰器的使用示例2
这个例子比较复杂 # coding=utf-8 # Author: RyAn Bi user,passwd = ' #输入用户名密码 def auth(auth_type): #装饰器第一层,确定鉴权 ...
- 问题 I: 闪闪发光
[提交] [状态] [命题人:外部导入] 题目描述 一所位于云南昆明的中医药本科院校--云南中医学院. 因为报考某专业的人数骤减,正面临着停招的危机. 其中有九名少女想到一条妙计——成为偶像, 只要她 ...
- 3Q大战现高潮,360 推出Android "3Q" IM即时通讯,岁末年初3Q大战惊现高潮
岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未 ...
- [Xamarin]測試帳號申請與到期後如何續用 (转帖)
在Xamarin網站上可以申請30天試用的測試帳號.試用期內,Xamarin會提供完整的功能試用. 30天試用時間到期後,在Visual Studio裡面你載入你的專案的時候,專案旁會標註(無法使用) ...
- 解决UnicodeDecodeError: 'ascii' code can't decode byte 0xef in position
今天在使用python的pip安装的时候出现了这个错误 UnicodeDecodeError: 'ascii' code can't decode byte 0xef in position 7: o ...
- 微软URLRewriter.dll的url重写的简单使用
1.先下载MSDNURLRewriting.zip包,打开代码生成URLRewriter.dll文件: 2.将URLRewriter.dll文件引用到项目中: 3.在web.config文件中 &l ...
- vue2.0读书笔记2-进阶
一.深入响应式原理 二.过渡效果 三.过渡状态 四.Render函数 五.自定义指令 六.混合 七.插件 八.单文件组件 九.生产环境 十.路由 vue-router: http://router.v ...
- 《TCP/IP详解》
TCP/IP概述 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本 ...