MVC的SignalR例子
# 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例子的更多相关文章
- mvc中signalr实现一对一的聊天
Asp.net MVC中实现即时通讯聊天的功能.前几天刚写了一片基础入门的教程,今天就来实现一下使用signaIr实现一对一的聊天的功能,对于这种场景也是即时通讯最基本功能.好吧废话不多说.先来看一下 ...
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)
简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...
- signalR例子
不用找了,比较全的signalR例子已经为你准备好了. 这几天想着将一个winform的工具上线到web上,因为对时时性的要求比较高,找朋友咨询了一下推荐了SignlarR 框架,比较强大.昨天才 ...
- C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表
本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...
- Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)
简介 ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端 ...
- 不用找了,比较全的signalR例子已经为你准备好了.
这几天想着将一个winform的工具上线到web上,因为对时时性的要求比较高,找朋友咨询了一下推荐了SignlarR 框架,比较强大.昨天才看到,今天研究了一下将里面的例子都拿出来共享. 最全的参考: ...
- Asp.NET websocket,Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)
ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及 ...
- 不用找了,比较全的signalR例子已经为你准备好了(2)---JqGrid 服务端刷新方式-注释详细-DEMO源码下载
上次用客户端进行数据刷新的方式,和官方的Demo实现存在差异性,今天花了一点时间好好研究了一下后台时时刷新的方式.将写的代码重新update了一次,在这之前找过好多的资料,发现都没有找到好的例子,自己 ...
随机推荐
- c# automapper 使用(一)
一.最简单的用法 有两个类User和UserDto public class User { public int Id { get; set; } public string Name { get; ...
- Linux 文件查看,文件夹切换,权限查看
当前用户只操作当前用户目录 1. 输入终端显示内容: 用户 @ 系统 : 路径信息 $ $ 表示普通用户 家目录 # 表示超级用户 家目录 [sudo -i ] 使用root用户 : 使用 ...
- Centos7更改yum源
每次都要百度一番,还不如自己做个记录,简单粗暴,哈哈哈哈 cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.repo.old wget http: ...
- python虚拟环境virtualenv简介
参考网站: https://realpython.com/python-virtual-environments-a-primer/ 一. 创建一个新的虚拟环境 # Python 2: $ virtu ...
- 【剑指offer】合并有序链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. *思路:假设两个链表的当前结点为n1(list1),n2(list2)比较链表结点值的大小,如果n1.va ...
- mysql识别中文
在配置的INI中加上这些 [mysql]default-character-set=utf8no-auto-rehash# Remove the next comment character if y ...
- Python Day5 模块 包
一:区分Python文件的2种用途 1个Python文件的2种用途 1.1 当作脚本执行: if __name__ == '__main__': 1.2 当作模块导入使用 if ...
- FileProvider相关 Failed to find configured root that contains
问题: 使用FileProvider构造SD卡中文件uri时异常 java.lang.IllegalArgumentException: Failed to find configured root ...
- Java笔记Spring(二)
spring-core 通过Gradle构建工具,转换包的命名空间为org.springframework下 cglib包,net.sf.cglib -> org.springframework ...
- node项目初始化的一些配置
1. const port = process.env.PORT || 9001; 本地开发用9001端口 2. package.json中配置几个启动命令 "scripts": ...