博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BS模式实现SignalR技术开发
阅读量:4696 次
发布时间:2019-06-09

本文共 6092 字,大约阅读时间需要 20 分钟。

前言

最近一段时间因目前在职公司的一些情况及个人的职业规划,参加面试几家金融股票应用软件及信息管理的企业,对于问的比较统一的或是比较多的就是如何利用服务器的消息推送实现股票证券行情的实时更新,根据个人的项目总结及网上其他博主的资源总结了利用SignalR技术实现实施更新。

SignalR概述

Asp.net SignalR是微软为实现实时通信的一个类库。一般情况下,SignalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通信,随着Html5中WebSockets出现,SignalR也支持WebSockets通信。另外SignalR开发的程序不仅仅限制于宿主在IIS中,也可以宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它可以实现跨平台部署在Linux环境下。

  SignalR内部有两类对象:

  1. Http持久连接(Persisten Connection)对象:用来解决长时间连接的功能。还可以由客户端主动向服务器要求数据,而服务器端不需要实现太多细节,只需要处理PersistentConnection 内所提供的五个事件:OnConnected, OnReconnected, OnReceived, OnError 和 OnDisconnect 即可。
  2. Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端可以利用URL来注册一个或多个Hub,只要连接到这个Hub,就能与所有的客户端共享发送到服务器上的信息,同时服务端可以调用客户端的脚本。

  SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

  客户端和服务端的具体交互情况如下图所示:

Invoking methods with SignalR

  从上面的介绍可以看出,SignalR既然是为实时而生的,这样就决定了其使用场所。具体适用情景有如下几点:

  1. 聊天室,如在线客服系统,IM系统等
  2. 股票价格实时更新
  3. 消息的推送服务
  4. 游戏中人物位置的实时推送

使用Asp.net SignalR在Web端实现广播消息

通过第二部分的介绍,相信大家对Asp.net SignalR有了一个初步的了解,接下来通过两个例子来让大家加深对SignalR运行机制的理解。第一个例子就是在Web端如何使用SignalR来实现广播消息。

  1. 使用Visual Studio 2013,创建一个MVC工程
  2. 通过Nuget安装SignalR包。右键引用-》选择管理Nuget程序包-》在出现的窗口中输入SignalR来找到SignalR包进行安装。
  3. 安装SignalR成功后,SignalR库的脚本将被添加进Scripts文件夹下。具体如下图所示:

  4. 向项目中添加一个SignalR集线器(v2)并命名为ServerHub。

  5. 将下面代码填充到刚刚创建的ServerHub类中。

using Microsoft.AspNet.SignalR;using Microsoft.AspNet.SignalR.Hubs;using System;namespace SignalRQuickStart{public class ServerHub : Hub    {        private static readonly char[] Constant =        {            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',            'w', 'x', 'y', 'z',            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',            'W', 'X', 'Y', 'Z'        };        ///         /// 供客户端调用的服务器端代码        ///         ///         public void Send(string message)        {            var name = GenerateRandomName(4);            // 调用所有客户端的sendMessage方法            Clients.All.sendMessage(name, message);        }        ///         /// 产生随机用户名函数        ///         /// 用户名长度        /// 
public static string GenerateRandomName(int length) { var newRandom = new System.Text.StringBuilder(62); var rd = new Random(); for (var i = 0; i < length; i++) { newRandom.Append(Constant[rd.Next(62)]); } return newRandom.ToString(); } }}

  6. 创建一个Startup类,如果开始创建MVC项目的时候没有更改身份验证的话,这个类会默认添加的,如果已有就不需要重复添加了。按照如下代码更新Startup类。

  7. 在Home控制器中创建一个Home Action方法

public class HomeController : Controller    {        public ActionResult Index()        {            return View();        }        public ActionResult About()        {            ViewBag.Message = "Your application description page.";            return View();        }        public ActionResult Contact()        {            ViewBag.Message = "Your contact page.";            return View();        }        public ActionResult Chat()        {            return View();        }    }

  8. 在Views文件中Home文件夹中创建一个Chat视图,视图代码如下所示:

@{    ViewBag.Title = "聊天窗口";}

Chat

    @section scripts{
    }

      9. 修改App_Start文件夹内的RoutConfig类,将Action方法默认设置为Chat.

    public class RouteConfig    {        public static void RegisterRoutes(RouteCollection routes)        {            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");            routes.MapRoute(                name: "Default",                url: "{controller}/{action}/{id}",                defaults: new { controller = "Home", action = "Chat", id = UrlParameter.Optional }            );        }    }

      到此,我们的例子就实现完成了,接下来我们先来看看运行效果,之后再来解释到底SignalR是如何来完成广播消息的。运行的运行结果如下。

      从运行结果,你可以发现,在任何一个窗口输入信息并发送,所有客户端将收到该消息。这样的效果在实际应用中很多,如QQ,一登录QQ的时候都会推送腾讯广告消息。

      看完了运行结果,接下来我们来分析下代码,进而来剖析下SignalR到底是如何工作的。

      按照B/S模式来看,运行程序的时候,Web页面就与SignalR的服务建立了连接,具体的建立连接的代码就是:$.connection.hub.start()。这句代码的作用就是与SignalR服务建立连接,后面的done函数表明建立连接成功后为发送按钮注册了一个click事件,当客户端输入内容点击发送按钮后,该Click事件将会触发,触发执行的操作为: chat.server.send($('#message').val())。这句代码表示调用服务端的send函数,而服务端的Send韩式又是调用所有客户端的sendMessage函数,而客户端中sendMessage函数就是将信息添加到对应的消息列表中。这样就实现了广播消息的功能了。 

      看到这里,有人是否会有疑问,前面的实现都只用到了集线器对象,而没有用到持久连接对象。其实并不是如此,$.connection这句代码就是使用持久连接对象,当然你也可以在重新OnConnected方法来查看监控客户端的连接情况,更新的代码如下所示:

     

    public class ServerHub : Hub    {        private static readonly char[] Constant =        {            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',            'w', 'x', 'y', 'z',            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',            'W', 'X', 'Y', 'Z'        };        ///         /// 供客户端调用的服务器端代码        ///         ///         public void Send(string message)        {            var name = GenerateRandomName(4);            // 调用所有客户端的sendMessage方法            Clients.All.sendMessage(name, message);        }        ///         /// 客户端连接的时候调用        ///         /// 
    public override Task OnConnected() { Trace.WriteLine("客户端连接成功"); return base.OnConnected(); } /// /// 产生随机用户名函数 /// /// 用户名长度 ///
    public static string GenerateRandomName(int length) { var newRandom = new System.Text.StringBuilder(62); var rd = new Random(); for (var i = 0; i < length; i++) { newRandom.Append(Constant[rd.Next(62)]); } return newRandom.ToString(); } }

     

      这样在运行页面的时候,将在输出窗口看到“客户端连接成功”字样。运行效果如下图所示:

      在第二部分介绍的时候说道,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,为了验证这一点,可以在Chrome中F12来查看源码就明白了,具体如下图所示:

     

      看到上图,你也就明白了为什么Chat.cshtml页面需要引入"signalr/hubs"脚本库了吧。

     参考文献:http://www.cnblogs.com/zhili/p/SignalRQuickStart.html

    转载于:https://www.cnblogs.com/fqzhong2007/p/8421187.html

    你可能感兴趣的文章
    红白球与小明
    查看>>
    查看sqlserver被锁的表以及如何解锁
    查看>>
    ViewPager 详解(一)---基本入门
    查看>>
    伪类和伪元素的区别
    查看>>
    poj2248——Addition Chains(迭代加深搜索)
    查看>>
    JS屏蔽右键菜单和禁止刷新F5
    查看>>
    在Linux上搭建Hadoop
    查看>>
    Python实例---模拟微信网页登录(day4)
    查看>>
    android入门——BroadCast(2)
    查看>>
    配置maven
    查看>>
    使用Xshell连接Ubuntu
    查看>>
    JAVA 仿 MS word 字数统计
    查看>>
    [2019HDU多校第五场][HDU 6626][C. geometric problem]
    查看>>
    OpenStack 镜像服务 Glance部署(七)
    查看>>
    STL源码解析-04序列容器-02list
    查看>>
    HDU 4865 Peter's Hobby(2014 多校联合第一场 E)(概率dp)
    查看>>
    设置ISE/vivado中默认文本编辑器为gvim
    查看>>
    Spring 基于注解的AOP实现
    查看>>
    AVAudioPlayer简易封装
    查看>>
    swappiness参数设置与内存交换
    查看>>