使用SignalR 2进行服务器广播

2023-11-04 04:59

本文主要是介绍使用SignalR 2进行服务器广播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

在本教程中,您将创建一个股票代码应用程序,该应用程序代表您希望定期“推送”或广播从服务器到所有连接客户端的通知的实时应用程序。在本教程的第一部分中,您将从头开始创建该应用程序的简化版本。在本教程的其余部分中,您将安装包含其他功能的NuGet包,并查看这些功能的代码。

您将在本教程的第一部分中构建的应用程序显示包含库存数据的网格。

服务器会定期随机更新股票价格并将更新推送到所有连接的客户端。在浏览器中,Change和%列中的数字和符号会根据来自服务器的通知动态更改。如果您打开其他浏览器到同一个URL,它们都会同时显示相同的数据和相同的数据更改。

该Microsoft.AspNet.SignalR.Sample NuGet包安装在Visual Studio项目的样本模拟股票行情应用。

设置服务器代码

在本节中,您将设置在服务器上运行的代码。

创建Stock类
首先创建将用于存储和传输股票信息的Stock模型类。

在项目文件夹中创建一个新的类文件,将其命名为Stock.cs,然后使用以下代码替换模板代码:

using System;
namespace SignalR.StockTicker
{
public class Stock
{
private decimal _price;
public string Symbol { get; set; }
public decimal Price
{
get
{
return _price;
}
set
{
if (_price == value)
{
return;
}
_price = value;
if (DayOpen == 0)
{
DayOpen = _price;
}
}
}
public decimal DayOpen { get; private set; }
public decimal Change
{
get
{
return Price - DayOpen;
}
}
public double PercentChange
{
get
{
return (double)Math.Round(Change / Price, 4);
}
}
}
}

创建股票时要设置的两个属性是Symbol(例如,Microsoft的MSFT)和Price。其他属性取决于您设置Price的方式和时间。第一次设置Price时,该值会传播到DayOpen。设置Price时的后续时间,Change和PercentChange属性值将根据Price和DayOpen之间的差异计算。

创建StockTicker和StockTickerHub类
您将使用SignalR Hub API来处理服务器到客户端的交互。从SignalR Hub类派生的StockTickerHub类将处理从客户端接收连接和方法调用。您还需要维护库存数据并运行Timer对象以定期触发价格更新,而与客户端连接无关。您不能将这些函数放在Hub类中,因为Hub实例是瞬态的。为集线器上的每个操作创建一个Hub类实例,例如从客户端到服务器的连接和调用。因此,保存库存数据,更新价格和广播价格更新的机制必须在一个单独的类中运行,您可以将其命名为StockTicker。

您只需要在服务器上运行StockTicker类的一个实例,因此您需要将每个StockTickerHub实例的引用设置为singleton StockTicker实例。StockTicker类必须能够向客户端广播,因为它具有库存数据并触发更新,但StockTicker不是Hub类。因此,StockTicker类必须获取对SignalR Hub连接上下文对象的引用。然后,它可以使用SignalR连接上下文对象向客户端广播。

在解决方案资源管理器中,右键单击该项目,然后单击添加| SignalR Hub Class(v2)。

将新集线器命名为StockTickerHub.cs,然后单击“ 添加”。SignalR NuGet包将添加到您的项目中。

使用以下代码替换模板代码:

 

该中心类是用来定义方法的客户端可以调用服务器上。您正在定义一种方法:GetAllStocks()。当客户端最初连接到服务器时,它将调用此方法以获取所有具有当前价格的股票的列表。该方法可以同步执行并返回,IEnumerable因为它从内存返回数据。如果方法必须通过执行涉及等待的操作(例如数据库查找或Web服务调用)来获取数据,则应指定Task<ienumerable>为返回值以启用异步处理。

HubName属性指定如何在客户端的JavaScript代码中引用Hub。如果不使用此属性,则客户端上的默认名称是类名称的驼峰版本,在本例中为stockTickerHub。

正如您稍后在创建StockTicker类时所看到的那样,在其静态Instance属性中创建该类的单例实例。无论有多少客户端连接或断开连接,StockTicker的单例实例都会保留在内存中,并且该实例是GetAllStocks方法用于返回当前股票信息的实例。

在项目文件夹中创建一个新的类文件,将其命名为StockTicker.cs,然后使用以下代码替换模板代码:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
namespace SignalR.StockTicker
{
public class StockTicker
{
// Singleton instance
private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>(() => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients));
private readonly ConcurrentDictionary<string, Stock> _stocks = new ConcurrentDictionary<string, Stock>();
private readonly object _updateStockPricesLock = new object();
//stock can go up or down by a percentage of this f

这篇关于使用SignalR 2进行服务器广播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343403

相关文章

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、