/// <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. Spring注入方式(2)

    3.引用其他bean Bean经常需要相互协作完成应用程序的功能,bean之间必须能够互相访问,就必须在bean配置之间指定对bean的引用,可以通过节点<ref>或者ref来为bean属 ...

  2. SpringBoot + Scala环境部署

    在pom.xml文件中添加: <dependencies>中 <!-- 添加Scala依赖 --> <dependency> <groupId>org. ...

  3. JS使用Crypto实现AES/ECS/zero-padding加密

    首先说一句,no-padding和zero-padding是一样的.他们指的是不够16位的情况补0至16位. 天知道网上为什么会出现两种叫法. 另附两个有用的网址 http://tool.chacuo ...

  4. 在 Go 语言中使用 Log 包--转自GCTT

    Linux 在许多方面相对于 Windows 来说都是独特的,在 Linux 中编写程序也不例外.标准输出,标准 err 和 null devices 的使用不仅是一个好主意,也是一个原则.如果您的程 ...

  5. JSP中使用JSTL表达式

    最近写web项目,为了使JSP代码美观好维护,决定采用EL&JSTL表达式.    EL表达式直接就可以用,但是JSTL表达式是属于apache的一个开源库,这个用起来就需要倒入一些jar包之 ...

  6. HDU - 6315 吉司机线段树

    题意:给出a,b数组,区间上两种操作,给\(a[L,R]\)+1s,或者求\(\sum_{i=l}^{r}a_i/b_i\) 一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好 维护区间a的最大值 ...

  7. jackson构建复杂Map的序列化

    1.序列化复杂的Map时,可能需要下面的方式 import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson. ...

  8. Windows下的VMware导入到Mac的VMware Function

    在windows下是以文件夹的形式存在的,但是在Mac下是以.vmwarevm为后缀的文件. 操作步骤: 把windows下的虚拟机整个文件夹拷贝到Mac,然后文件夹后面加上.vmwarevm. 然后 ...

  9. (转)Mysql占用过高CPU时的优化手段

    Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...

  10. Linux系统编程:socket网络编程(操作篇)

    一.问题思考 问1.网络通信应用在什么场合?通信的前提是什么? 答1.主要应用在不同主机进程间的互相通信,同一主机的进程也可以使用网络进行通信.通信的前提是如何标识通信进程的唯一,由于不同主机的进程极 ...