# SignalR学习

ASP.NET SignalR 是为.NET 开发者提供即时通讯Web 应用的类库。即时通讯Web服务就是服务器将内容自动推送到已经连接的客户端,而不是服务器等待客户端发起一个新的数据请求。SignalR简化了构建实时应用的过程,它包括了一个Asp .Net服务器端库和一个Js端库,集成了数种常见的消息传输方式,如long polling,WebSocket,并提供相应的Api供开发人员选择如何调用,帮助其可以简单快速地实现客户端与服务器端相互间的实时通信。
当环境条件合适时,SignalR将WebSocket作为底层传输方式的优先实现,当然,它也能很高效地回退到其他技术。同时,SignalR提供了非常良好的Api以供远程调用(RPC) 浏览器中的js代码。

### SignalR的优点

1. SignalR 不仅能够自动管理连接,而且能够同时向所有的客户端广播消息,就像聊天室一样。你也能够发送消息到指定的客户端。SignalR提供的连接是持久的,它不像传统的HTTP连接需要为每次收发消息建立单独的连接。
2. SignalR 同时在服务端提供了远程过程调用协议(RPC),让你能够“主动”推送消息到浏览器中的客户端,而不像普通的Web服务一样的应答方式。
3. SignalR 应用能够运用到成千的客户端上,通过使用服务总线、SQL Server或者Redis。
4. SignalR 是开源的,能够通过GitHub很容易得到。

### 应用场景

1. 即时响应应用,例如:在线聊天,游戏,天气或者股票信息
2. 用户需要随时更新数据的网页运用,例如:仪表盘和监控运用,其他协同应用程序(文档协同操作)、工作流更新或者是即时表格
3. 高频繁从服务器更新的应用,例如:实时在线游戏

### 官方网址

1. https://docs.microsoft.com/en-us/aspnet/signalr/
2. https://github.com/SignalR/SignalR

### 运行效果图

### 核心代码

后台代码

using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web; namespace MvcSignalR.Services
{
/// <summary>
/// 数据交流类
/// </summary>
public class ChatServiceHub : Hub
{
//所有的ConnectionId
public static ConcurrentDictionary<string,DateTime> AllConnectionIDs = new ConcurrentDictionary<string, DateTime>();
//用户的ConnectionID,一个ID对应一个用户
public static ConcurrentDictionary<string, string> UserConnectionIDs = new ConcurrentDictionary<string, string>(); private Random rd = new Random(); public void Send(string message)
{
int i = ;
while (i < )
{
i++;
Thread.Sleep();
Clients.Client(Context.ConnectionId).broadcastMessage(Context.ConnectionId, message + rd.Next());
}
} public void SendMessage(string message)
{
Clients.Client(Context.ConnectionId).receiveMessage(message + rd.Next());
} public override Task OnConnected()
{
AllConnectionIDs.AddOrUpdate(Context.ConnectionId, DateTime.Now, (key, oldValue) => DateTime.Now);
return base.OnReconnected();
}
}
}

前台代码

@{
ViewBag.Title = "QQ";
}
<link href="~/Content/qq.css" rel="stylesheet" />
<h2></h2>
<div class="qqBox">
<div class="BoxHead">
<div class="headImg">
<img src="~/Images/qq/1004.jpg" />
</div>
<div class="internetName">signalR模拟QQ</div>
</div>
<div class="context">
<div class="conLeft">
<ul>
<li>
<div class="liLeft"><img src="~/Images/qq/1002.jpg" /></div>
<div class="liRight">
<span class="intername">SignalR群</span>
<span class="infor">厉害了</span>
</div>
</li>
<li class="bg">
<div class="liLeft"><img src="~/Images/qq/1001.jpg" /></div>
<div class="liRight">
<span class="intername">小华</span>
<span class="infor">[流泪]</span>
</div>
</li>
<li>
<div class="liLeft"><img src="~/Images/qq/1002.jpg" /></div>
<div class="liRight">
<span class="intername">SignalR交流群</span>
<span class="infor">666</span>
</div>
</li>
</ul>
</div>
<div class="conRight">
<div class="Righthead">
<div class="headName">小华</div>
<div class="headConfig">
<ul>
<li><img src="~/Images/qq/20170926103645_06.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_08.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_10.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_12.jpg" /></li>
</ul>
</div>
</div>
<div class="RightCont">
<ul class="newsList"></ul>
</div>
<div class="RightFoot">
<div class="footTop">
<ul>
<li><img src="~/Images/qq/20170926103645_31.jpg" /></li>
<li class="ExP"><img src="~/Images/qq/20170926103645_33.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_35.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_37.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_39.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_41.jpg" alt="" /></li>
<li><img src="~/Images/qq/20170926103645_43.jpg" /></li>
<li><img src="~/Images/qq/20170926103645_45.jpg" /></li>
</ul>
</div>
<div class="inputBox">
<textarea id="dope" style="width: 99%;height: 75px; border: none;outline: none;" name=""></textarea>
<button class="sendBtn">发送(s)</button>
</div>
</div>
</div>
</div>
</div> @section scripts{
<script src="~/Scripts/jquery.signalR-2.3.0.js"></script>
<script src="~/signalr/hubs"></script>
<script src="~/Scripts/qq.js"></script>
}

js代码

$(function () {
// Declare a proxy to reference the hub.
var chat = $.connection.chatServiceHub;
// 接受信息
chat.client.receiveMessage = function (message) {
receiveMessage(message);
};
$.connection.hub.start(); // 左边列表
$('.conLeft li').on('click', function () {
$(this).addClass('bg').siblings().removeClass('bg');
var intername = $(this).children('.liRight').children('.intername').text();
$('.headName').text(intername);
$('.newsList').html('');
}); //发送信息
$('.sendBtn').on('click', function () {
var news = $('#dope').val();
if (news == '') {
alert('不能为空');
} else {
chat.server.sendMessage(news);
sendMessage(news);
$('#dope').val('');
}
}); function sendMessage(message) {
var str = '';
str += '<li>' +
'<div class="nesHead"><img src="/Images/qq/1004.jpg"/></div>' +
'<div class="news"><img class="jiao" src="/Images/qq/20170926103645_03_02.jpg">' + message + '</div>' +
'</li>';
$('.newsList').append(str);
$('.conLeft').find('li.bg').children('.liRight').children('.infor').text(message);
$('.RightCont').scrollTop($('.RightCont')[0].scrollHeight);
} function receiveMessage(message) {
var answer = '';
answer += '<li>' +
'<div class="answerHead"><img src="/Images/qq/1003.jpg"/></div>' +
'<div class="answers"><img class="jiao" src="/Images/qq/jiao.jpg">' + message + '</div>' +
'</li>';
$('.newsList').append(answer);
$('.RightCont').scrollTop($('.RightCont')[0].scrollHeight);
}
});

### git地址(Demo)

https://github.com/jasonhua95/MvcSignalR.git

MVC的SignalR例子的更多相关文章

  1. mvc中signalr实现一对一的聊天

    Asp.net MVC中实现即时通讯聊天的功能.前几天刚写了一片基础入门的教程,今天就来实现一下使用signaIr实现一对一的聊天的功能,对于这种场景也是即时通讯最基本功能.好吧废话不多说.先来看一下 ...

  2. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  3. Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

    简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...

  4. signalR例子

    不用找了,比较全的signalR例子已经为你准备好了.   这几天想着将一个winform的工具上线到web上,因为对时时性的要求比较高,找朋友咨询了一下推荐了SignlarR 框架,比较强大.昨天才 ...

  5. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

    本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...

  6. Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)

    简介       ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端 ...

  7. 不用找了,比较全的signalR例子已经为你准备好了.

    这几天想着将一个winform的工具上线到web上,因为对时时性的要求比较高,找朋友咨询了一下推荐了SignlarR 框架,比较强大.昨天才看到,今天研究了一下将里面的例子都拿出来共享. 最全的参考: ...

  8. Asp.NET websocket,Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)

    ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及 ...

  9. 不用找了,比较全的signalR例子已经为你准备好了(2)---JqGrid 服务端刷新方式-注释详细-DEMO源码下载

    上次用客户端进行数据刷新的方式,和官方的Demo实现存在差异性,今天花了一点时间好好研究了一下后台时时刷新的方式.将写的代码重新update了一次,在这之前找过好多的资料,发现都没有找到好的例子,自己 ...

随机推荐

  1. 账户和联系人 Accounts and Contacts 译

    原文链接: https://crmbook.powerobjects.com/basics/searching-and-navigation/understanding-accounts-and-co ...

  2. 让Mustache支持简单的IF语句

    转载:https://blog.csdn.net/iteye_16732/article/details/82070065 Mustache是一种Logic-less templates.不支持if这 ...

  3. springboot中添加热部署

    <dependency> <!--Spring 官方提供的热部署插件 --> <groupId>org.springframework.boot</group ...

  4. <Vector Calculus>(by Paul C, Matthews) Notes

    现在流行用Exterior Caculus, 所以个人觉得Matthews这本书有点过时了. 想学Vector Calculus的话,推荐<Vector Calculus, Linear Alg ...

  5. C#控制台程序点击后暂停工作

    C#控制台应用程序,点击后就会暂停运行,但是我想让它运行不受点击的干扰.下面是程序演示: public void Test() { ThreadOut(); } private void Thread ...

  6. (Android第一行代码实验一)活动的最佳实践

    活动的最佳实践    1.知晓当前是在哪一个活动         这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动.  首先需要新建一个 BaseActivity 继承自 Activi ...

  7. servlet cdi注入

    @WebServlet("/cdiservlet")//url映射,即@WebServlet告诉容器,如果请求的URL是"/cdiservlet",则由NewS ...

  8. java 调用 python 的几种方法整理

    参考:   https://blog.csdn.net/secondlieutenant/article/details/79000265

  9. 第一篇、Python初识

    1.Python文件后缀是否可以任意? 单独执行的时候没关系,但当文件需要导入(即导入模块)的时候,如果不是py后缀的,会出错. 2.执行方法 1) python +文件路径 python + fil ...

  10. ajax单删

    通过点击事件获取相应数据的id,将id传到的控制器,根据id执行删除的sql语句,执行官删除:同时ajax的有点就是快捷方便,无刷新,增强用户的体验. <?php namespace app\i ...