SignalR实现服务器与客户端的实时通信
百度百科给它的定义
实现实时通信。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。
它的作用
它最强吸引我的地方
实例代码
using Microsoft.Owin;
using Owin; [assembly: OwinStartup(typeof(SignalR.Core.Startup))]
namespace SignalR.Core
{ public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
} }
}
三 一组SignalR的JS文件
aaarticlea/png;base64,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" alt="" />
四 实现具体业务的核心类文件,它需要集成Hub,需要使用特性HubName为SignalR起个名字,以便在客户端去调用它
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using SignalR.Core.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace SignalR.Core
{ [HubName("UrlHub")]
public class UrlValid : Hub
{
static List<CurrentUser> ConnectedUsers = new List<CurrentUser>();
public void Connect(string url,string userID)
{
var id = Context.ConnectionId;
if (ConnectedUsers.Count(x => x.ConnectionId == id) == )
{
ConnectedUsers.Add(new CurrentUser
{
ConnectionId = id,
UserID = userID,
});
Clients.Caller.onConnected(id, userID, url);
//Clients.AllExcept(id).onNewUserConnected(id, userID); Clients.Client(id).onNewUserConnected(id, userID);
}
else
{ Clients.Caller.onConnected(id, userID, url);
Clients.Client(id).onExistUserConnected(id, userID);
// Clients.AllExcept(id).onExistUserConnected(id, userID);
}
} /// <summary>
/// 登出
/// </summary>
public void Exit(string userID)
{
var id = Context.ConnectionId; OnDisconnected();
Clients.Caller.onConnected(id, userID, "");
Clients.Client(id).onExit(id, userID);
} /// <summary>
/// 断开
/// </summary>
/// <returns></returns>
public override System.Threading.Tasks.Task OnDisconnected()
{
var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
ConnectedUsers.Remove(item); var id = Context.ConnectionId;
Clients.All.onUserDisconnected(id, item.UserID); }
return base.OnDisconnected();
} }
}
五 核心JS功能代码片断
<!--Reference the jQuery library. -->
<script src="/Scripts/jquery-1.8.2.min.js"></script> <!--Reference the SignalR library. -->
<script src="/Scripts/jquery.signalR-1.0.0.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/signalr/hubs"></script> <script type="text/javascript">
$(function () {
// Declare a proxy to reference the hub
var chatHub = $.connection.UrlHub;
registerClientMethods(chatHub);
// Start Hub
$.connection.hub.start().done(function () {
registerEvents(chatHub);
}); }); //注册客户端事件
function registerEvents(chatHub) {
$("#btn").click(function () {
var url = "dasfjasldfj";
chatHub.server.connect(url);
}); $("#logOut").click(function () {
chatHub.server.exit();
}); } //注册客户端方法
function registerClientMethods(chatHub) { chatHub.client.onConnected = function (id, userID, url) {
console.log("与服务器建立了链接" + url);
} chatHub.client.onUserDisconnected = function (id, userID) {
console.log("与服务器取消了链接");
} chatHub.client.onNewUserConnected = function (id, userID) {
alert("新用户完成为合法");
} chatHub.client.onExistUserConnected = function (id, userID) {
alert("用户" + userID + "不能重复登陆");
} chatHub.client.onExit = function (id, userID) { alert("用户" + userID + "成功退出!");
} } </script>
OK,现在运行你的程序,就可以实现客户端与服务器端实时通信了,利用这些特性,我们是不是可以实现很多事情呀,让消息推送更可靠吧!
SignalR实现服务器与客户端的实时通信的更多相关文章
- SignalR一个集成的客户端与服务器库。内部的两个对象类:PersistentConnection和Hub
SignalR 将整个交换信息的行为封装得非常漂亮,客户端和服务器全部都使用 JSON 来沟通,在服务器端声明的所有 hub 的信息,都会一般生成 JavaScript 输出到客户端. 它是基于浏览器 ...
- [渣译文] SignalR 2.0 系列:SignalR的服务器广播
英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第八篇:SignalR的服务器广 ...
- SignalR 实现web浏览器客户端与服务端的推送功能
SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...
- SignalR 2.0 系列:SignalR的服务器广播
英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第八篇:SignalR的服务器广 ...
- 第六章SignalR的服务器广播
第六章SignalR的服务器广播 1.概述: VS可以通过 Microsoft.AspNet.SignalR.Sample NuGet包来安装一个简单的模拟股票行情应用.在本教程的第一部分,您将从头开 ...
- SignalR的服务器广播
可以试试 https://github.com/angular-ui/bootstrap 这个框架啊 [渣译文] SignalR 2.0 系列:SignalR的服务器广播 2014-03-13 09: ...
- 【node】node的核心模块---http模块,http的服务器和客户端
nodejs事件机制 ##### http服务器和客户端 node.js标准库提供了http模块,其中封装了一个高效的http服务器和一个简易的http客户端 HTTP服务器 1. http.crea ...
- SVN服务器和客户端安装教程
SVN是什么?有何用? SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁 ...
- 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world
2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...
随机推荐
- 自定义底部tab
public class MainActivity extends TabActivity implements OnCheckedChangeListener { private RadioGrou ...
- OA 办公自动化系统:权限管理模块的实现原理思路
OA系统分有许多的模块,如系统管理模块.等一些比较高级的业务操作.此类业务是不允许让普通员工来操作的,思路如下: 给系统添加角色表,每个用户对应一个角色,每个角色可以拥有多个权限, 如下:创建权限表( ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- count distinct 多个字段 或者 count(*) 统计group by 结果
SELECT COUNT(*) FROM( SELECT 列名 FROM 表名 where ( 条件 )GROUP BY 多字段)临时表名 例如: SELECT COUNT(*) FROM(SELEC ...
- Ubuntu 14.04 (32位)上搭建Hadoop 2.5.1单机和伪分布式环境
引言 一直用的Ubuntu 32位系统(准备下次用Fedora,Ubuntu越来越不适合学习了),今天准备学习一下Hadoop,结果下载Apache官网上发布的最新的封装好的2.5.1版,配置完了根本 ...
- 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j
解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
[前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...
- [Python] 关于64位机的numpy安装问题
最近刚换成64位的系统,重新安装了win10,VS也从原来的2010变为了现在的2013. 利用原来32位电脑硬盘里的python2.7安装包安装,然后打算安装numpy. 上来碰到问题:在windo ...
- 包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 解法一: 思路:采用java中自带的迭代函数进行处理. public class Solution{ /** * @pa ...
- 按enter执行click或者搜索问题
最近需要将按按钮搜索的功能,改为支持按enter回车键,搜索. 实现按enter,执行click事件还是比较简单的. //按回车搜索用户 $(window).keydown(function (eve ...