SignalIR入门

news2024/10/6 14:23:00

SignalIR入门

  • 简介
  • 教程
    • 1.创建项目
    • 2.添加 SignalR 客户端库
    • 3.创建 SignalR 中心
    • 4.配置 SignalR
    • 5.添加 SignalR 客户端代码
  • 效果

简介

SignalR 是一个用于构建实时 Web 应用程序的开发工具和库,它可以让服务器端代码与客户端代码之间建立双向通信。SignalR 的中文解释可以理解为 “信号传输” 或 “信号通信”。

SignalR 提供了一种简单的方式,让服务器可以向客户端发送实时更新,而无需客户端不断地发出请求。这使得开发者可以创建具有实时特性的应用程序,如在线聊天、实时游戏、协作工具等。SignalR 可以在多种平台和编程语言中使用,包括 .NET、JavaScript、Java、Python 等,因此它在跨平台的实时通信方面非常有用。

SignalR 使用不同的传输协议,如 WebSockets、Server-Sent Events(SSE)、长轮询等,以确保在各种环境中都能提供实时性能。无论是在 Web 应用、移动应用还是桌面应用中,SignalR 都为开发者提供了强大的实时通信功能。这使得用户可以在应用程序中获得即时的更新,而不必等待页面刷新或手动触发操作。

教程文档

教程

1.创建项目

在“配置新项目”对话框中,为“项目名称”输入 SignalRChat。 请务必将项目命名为 SignalRChat(包括匹配大写),以便命名空间与教程中的代码匹配。

在这里插入图片描述

2.添加 SignalR 客户端库

  1. 为“提供程序”选择“unpkg”
  2. 对于“库”,请输入 @microsoft/signalr@latest。
  3. 选择“选择特定文件”,展开“dist/browser”文件夹,然后选择 signalr.js 和 signalr.min.js。
  4. 将“目标位置”设置为 wwwroot/js/signalr/。
    选择“安装” 。

在这里插入图片描述

3.创建 SignalR 中心

在 SignalRChat 项目文件夹中,创建 Hubs 文件夹。
在 Hubs 文件夹中,使用以下代码创建 ChatHub 类:

using Microsoft.AspNetCore.SignalR;

namespace SignalRChat.Hubs
{
    public class ChatHub : Hub
    {
        public async Task SendMessage(string user, string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
    }
}

4.配置 SignalR

using SignalRChat.Hubs;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();//添加此服务

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chatHub");//添加此服务

app.Run();

5.添加 SignalR 客户端代码

使用以下代码替换 Pages/Index.cshtml 中的内容:

@page
    <div class="container">
        <div class="row p-1">
            <div class="col-1">User</div>
            <div class="col-5"><input type="text" id="userInput" /></div>
        </div>
        <div class="row p-1">
            <div class="col-1">Message</div>
            <div class="col-5"><input type="text" class="w-100" id="messageInput" /></div>
        </div>
        <div class="row p-1">
            <div class="col-6 text-end">
                <input type="button" id="sendButton" value="Send Message" />
            </div>
        </div>
        <div class="row p-1">
            <div class="col-6">
                <hr />
            </div>
        </div>
        <div class="row p-1">
            <div class="col-6">
                <ul id="messagesList"></ul>
            </div>
        </div>
    </div>
<script src="~/js/signalr/dist/browser/signalr.js"></script>
<script src="~/js/chat.js"></script>

在 wwwroot/js 文件夹中,使用以下代码创建 chat.js 文件:

//这是 JavaScript 严格模式的声明,它有助于捕获代码中的潜在错误,并提高代码质量。
"use strict";

//这是创建 SignalR 连接的关键部分。它使用 SignalR 客户端库中的 HubConnectionBuilder 
//来创建连接对象。withUrl 方法指定了连接的目标 URL,这里是 "https://localhost:7124/chatHub",
//这应该是你的 SignalR 服务器上定义的 Hub 的地址。
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();

//这一行代码将 HTML 页面中 id 为 "sendButton" 的按钮设置为禁用状态,
//以防止在连接建立之前点击按钮。
document.getElementById("sendButton").disabled = true;

//这是一个事件处理程序,用于处理从服务器端接收到的消息。
//当服务器端使用 SendMessge 方法发送消息时,这个事件处理程序会被触发,
//然后在页面上创建一个新的列表项(li),显示接收到的消息。
connection.on("ReceiveMessage", function (user, message) {
    var li = document.createElement("li");
    document.getElementById("messagesList").appendChild(li);
    li.textContent = `${user} says ${message}`;
});

//这是用于建立连接的代码。connection.start() 方法尝试连接到服务器,
//如果连接成功,则启用 "sendButton" 按钮,并在连接失败时处理错误。
connection.start().then(function () {
    document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
    return console.error(err.toString());
});

//这段代码为 "sendButton" 按钮添加了一个点击事件监听器,
//当用户点击按钮时,它会从页面上获取用户输入的用户名和消息文本,然后使用 
//connection.invoke("SendMessage", user, message) 
//来调用服务器上的 SendMessage 方法,将消息发送给服务器。
document.getElementById("sendButton").addEventListener("click", function (event) {
    var user = document.getElementById("userInput").value;
    var message = document.getElementById("messageInput").value;
    connection.invoke("SendMessage", user, message).catch(function (err) {
        return console.error(err.toString());
    });
    event.preventDefault();
});

效果

从地址栏复制 URL,打开另一个浏览器实例或选项卡,并在地址栏中粘贴该 URL。
选择任一浏览器,输入名称和消息,然后选择“发送消息”按钮。
两个页面上立即显示名称和消息。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023 CCF中国开源大会会议通知(第一轮)

一、会议简介 2023 CCF中国开源大会&#xff08;CCF ChinaOSC&#xff09;拟于2023年10月21日至22日在湖南省长沙市北辰国际会议中心召开。大会由中国计算机学会&#xff08;CCF&#xff09;、开放原子开源基金会主办&#xff0c;CCF开源发展委员会、湖南先进技术研究院承办&a…

Windows服务器 开机自启动服务

1、新建txt&#xff0c;并粘贴下面脚本 start cmd /k "cd /d D:\ahjd&&java -jar clips-admin.jar" start cmd /k "cd /d D:\ahjd\dist&&simple-http-server.exe -i -p 8000"说明&#xff0c;脚本格式为&#xff1a;start cmd /k “cd /d…

OLED透明屏技术在智能手机、汽车和广告领域的市场前景

OLED透明屏技术作为一种新型的显示技术&#xff0c;具有高透明度、触摸和手势交互、高画质和图像显示效果等优势&#xff0c;引起了广泛的关注。 随着智能手机、汽车和广告等行业的快速发展&#xff0c;OLED透明屏技术也在这些领域得到了广泛的应用。 本文将介绍OLED透明屏技…

千万别再学python编程了?编程没用了?马上就要被淘汰啦?

最近&#xff0c;看到网上好多人站在在职程序员的角度去分析编程语言的一个优劣&#xff0c;劝小白学这个语言别学那个语言&#xff0c;这对小白来说是毫无意义的。 但是它又具有极强的一个误导性。 为什么呢&#xff1f; 一、语言只是工具&#xff0c;解决问题才是关键 编程…

web漏洞-SSRF服务端请求伪造

目录 SSRF服务端请求伪造一、定义二、漏洞成因三、漏洞探测四、漏洞利用五、复现pikachu靶场SSRF实验&#xff0c;并且探测靶机端口开放情况。六、利用SSRF探测内网环境并获取shell七、绕过技巧八、SSRF防御方案九、总结 SSRF服务端请求伪造 一、定义 SSRF&#xff08;Server-…

微信小程序拉取代码到运行过程(mac)

微信小程序拉取代码到运行过程&#xff08;mac&#xff09; window也可以参考 1.克隆代码 2.进入项目&#xff0c;安装依赖 此时项目中已经有node_modeles了 3.打开微信开发者工具&#xff0c;导入项目 点击项目-导入 导入刚刚克隆的项目&#xff0c;AppID会自动填入 这里…

基于Springboot实现简历管理系统演示【项目源码+论文说明】分享

基于Springboot实现简历管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;简历系统当然也不能排除在外。简历系统是以实际运用为开发背景&#xff0c;运用软件…

剑指offer——JZ82 二叉树中和为某一值的路径(一) 解题思路与具体代码【C++】

一、题目描述与要求 二叉树中和为某一值的路径(一)_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉树root和一个值 sum &#xff0c;判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 …

consulmanage部署

一、部署consul 使用yum方式部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo yum -y install consul 执行以下命令获取uuid密钥并记录下来 uuidgen 编辑consul配置文件 vi /etc/consul.d/consul.h…

【Vue面试题四】、Vue实例挂载的过程中发生了什么?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Vue实例挂载的过程 一、…

【抓包https请求网络异常/无数据怎么破】

当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息。 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的Ap…

it端到端运营监控

公司的运维监控已成为确保业务顺利运行的关键。特别是对于IT部门&#xff0c;端到端运维监控不仅可以帮助企业及时发现和解决问题&#xff0c;还可以提高业务效率&#xff0c;优化客户体验。端到端运维监控的概念、重要性及其实施方法。 端到端操作监控的概念 端到端操作监控&…

文件IO函数

目录 通用IO模型&#xff1a;open、read、write、lseek、close 举例1 举例2 非通用函数&#xff1a;ioctl/mmap mmap ioctl 函数用法帮助命令 help man info 系统调用函数怎么进入内核&#xff1f; 内核的sys_open、sys_read会做什么&#xff1f; 通用IO模型&#…

FUXA入门教程

通过docker安装fuxa后&#xff1a; 打开后的界面如下&#xff1a; 完整配置如下&#xff1a; MQTT驱动演示

C++三大特性——继承(上篇)

文章目录 目录 一、继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 一、继承的概念及定义 1.1继承的概念 继承(inherita…

【消费战略方法论】消费烙印的策略模型

消费烙印策略模型 消费烙印策略&#xff0c;以消费者认知为导向&#xff0c;以品牌核心价值为中心&#xff0c;建立统一、高效、落地的品牌系统闭环&#xff0c;通过极致烙印方法(定位语言烙印、视觉烙印、产品烙印)让品牌价值烙印深植消费者心智。 消费烙印的对象是消费者&a…

QQ浏览器怎么才能设置默认搜索引擎为百度

问题&#xff1a; 打开QQ浏览器&#xff0c;搜索相关信息时发现总是默认为”搜狗搜索引擎“&#xff0c;想将其转为”百度搜索引擎“ 解决&#xff1a; 1、点击浏览器右侧”菜单“图标&#xff0c;选择”设置“&#xff0c;如下图所示&#xff1a; 2、在”常规设置“中的”搜…

一篇概全,接口测试知识盲扫,真正的接口测试是如何做的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口测试的基本…

基于虚幻引擎的AI训练合成数据生成

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 近年来&#xff0c;合成数据生成&#xff08;Synthetic Data Generation&#xff09;已成为手动收集和注释数据集的替代方法。 数据合成器的优点主要有两个。 首先&#xff0c;它使获取数据的成本几乎为零&#xff0c;同时…

Java读取Excel内容,最后获得一个list对象

代码层 public R importPackage(MultipartFile multipartFile) {try {log.info("multipartFile " multipartFile);log.info("ContentType " multipartFile.getContentType());log.info("OriginalFilename " multipartFile.getOriginalFil…