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是用来帮助各个编程语 ...
随机推荐
- error in opening zip file 1 错误
项目部署服务启动时会出现: error in opening zip file 1 错误 原来是不同服务器编译过的jar包直接下载后发布有问题,重新上传本地编译好的lib下面的jar包后,启动服务,正 ...
- Redis 软件和配置
Redis 下载 1.通过CMD命令进入redis 文件目录 2.运行[redis-server redis.windows.conf]
- 深入理解JVM内存模型
1.程序计数器在虚拟机的概念模型里字节码解释器工作时就是通过改变 这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理. Java 虚拟机的多线程是通过线程轮流切换并分配处理器执 ...
- locutus(phpjs) 的使用
今天来介绍一个js的框架,这个框架的主要功能呢,是通过加载该类库,来实现php函数的调用 当然了,这并不是说php中所有的函数都能在js中使用,但很大一部分是可以的. 环境:mac + node v5 ...
- MySQL Batch 与 Transaction
最近在数据库上经常遇到死锁问题. 表现的问题有 1. 有一个查询为: 1) 一个复杂的 select 查处一组大数据 2) 使用事务 update 这组数据的状态 为了让锁定的时间变短, 我将这整个大 ...
- Python使用中文注释和输出中文(原创)
刚开始学习python,需要在Python中注释中文和输出中文,现在开始尝试: 仅为初步学习参考,高手请绕行. -------------------------------------------- ...
- Spring 4 官方文档学习(十一)Web MVC 框架之约定优于配置
当返回一个ModelAndView时,可以使用其addObject(Object obj)方法,此时的约定是: An x.y.User instance added will have the nam ...
- jsp-avaBean
package javaBean; public class pagecount { private long count=0; public long getcount() { return cou ...
- LeetCode(84) Largest Rectangle in Histogram
题目 Given n non-negative integers representing the histogram’s bar height where the width of each bar ...
- submit(提交)按钮
为form添加一个submit(提交)按钮,点击这个按钮,表单中的数据将会被发送到通过action属性指定的地址上. 下面是submit按钮的例子: <button type="sub ...