C#利用SignalR实现通信事例Demo

1.服务端安装SignalR的Nuget包

dotnet add package Microsoft.AspNet.SignalR --version 2.4.3

2.接下来,创建一个ChatHub类,它是SignalR通信的核心:

using Microsoft.AspNetCore.SignalR;public class ChatHub : Hub
{public static Dictionary<string, string> user = new();public void Connect(string key){if (user.ContainsKey(key)) { user.Remove(key); }user.Add(key,Context.ConnectionId);Console.WriteLine("("+ DateTime.Now +")客户端:"+ key + "上线成功!");}public async Task HandMsg(Chat chat){chat.time = DateTime.Now;ChatHandlerService handler;switch ( (Command) chat.cmd){case Command.PRIVATE:handler = new PrivateServiceImpl();await handler.execute(chat,user,Context,Clients);break; case Command.LINERADIO:handler = new LineradioServiceImpl();await handler.execute(chat, user, Context, Clients);break;}}
}
  •  这个是信息处理的提取ChatHandlerService
public interface ChatHandlerService
{Task execute(Chat chat,Dictionary<string, string> user,HubCallerContext context, IHubCallerClients clients);
}
  •  这个是单聊的具体实现
public class PrivateServiceImpl : ChatHandlerService
{public Task execute(Chat chat, Dictionary<string, string> user, HubCallerContext context, IHubCallerClients clients){if (user.ContainsKey(chat.target!)){string target = user[chat.target!];clients.Client(target).SendAsync("receive", chat);return Task.CompletedTask;}chat.message = "好友不在线";clients.Client(context.ConnectionId).SendAsync("receive", chat);return Task.CompletedTask;}
}
  • 这个是 通知全部在线的用户

public class LineradioServiceImpl : ChatHandlerService
{public async Task execute(Chat chat, Dictionary<string, string> user, HubCallerContext context, IHubCallerClients clients){await clients.All.SendAsync("receive", chat); }
}
  •  指令枚举
public enum Command
{PRIVATE = 300,GROUP = 400,LINERADIO = 500
}
  • 聊天模型 
public class Chat
{public string userKey { get; set; } = null!;public string? target { get; set; }public string? message { get; set; }public int type { get; set; }public int cmd { get; set; }public DateTime time { get; set; }
}

提示:Connect是连接的实例方法,当客户端成功后在回调使用此方法,HandMsg是我的信息处理方法,其中你可以不用我的service和实现层,直接在ChatHub类中使用你传入的数据就可以了。

3.在Program中使用

builder.Services.AddSignalR();builder.Services.AddCors(options =>
{options.AddDefaultPolicy(builder =>{builder.WithOrigins("http://localhost").AllowAnyHeader().WithMethods("GET", "POST").AllowCredentials();});
});app.MapHub<ChatHub>("/chathub");

提示:注意需要配置跨域

4.编写客服端代码

<!DOCTYPE html>
<html lang="">
<head><title>SignalR</title><script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js"></script><meta charset="utf-8" />
</head>
<style>input {border-radius: 12px;padding: 5px 5px;}.sendButton {width:200px;border-radius: 12px;background: #3F95FF;padding: 6px 0;border: none;color: white;}
</style>
<body><h1>SignalR</h1>
<div style="display: flex;gap: 12px;flex-direction: column"><div><label for="target">发送给:</label><input type="text" id="target" /></div><div><label for="msg">信息:</label><input type="text" id="msg" /></div><div><button type="button" id="sendButton" class="sendButton">发送</button></div>
</div>
<div><ul id="messagesList"></ul>
</div><script>/*** 获取URL中的查询参数值** @param {string} name - 查询参数名* @returns {string|null} - 查询参数值,如果不存在则返回null*/function getQueryParam(name) {const urlParams = new URLSearchParams(window.location.search);return urlParams.get(name);}/*** 初始化SignalR连接*/const connection = new signalR.HubConnectionBuilder().withUrl("https://localhost:7066/chathub").configureLogging(signalR.LogLevel.Information).build();/*** 监听服务器发送的消息** @param {object} res - 接收到的消息对象*/connection.on("receive", res => {const li = document.createElement("li");li.textContent = `${ res.userKey  }: ${res.message}`;document.getElementById("messagesList").appendChild(li);});/*** 启动SignalR连接,并调用Connect方法向服务器发送连接请求*/connection.start().then(() => {connection.invoke("Connect", getQueryParam("key")).catch(err => console.error(err.toString()));}).catch(function (err) {return console.error(err.toString());});/*** 发送按钮点击事件处理函数** @param {Event} event - 事件对象*/document.getElementById("sendButton").addEventListener("click", event => {const target = document.getElementById("target").value;const message = document.getElementById("msg").value;let sendMessage = {userKey: getQueryParam("key"),target: target,cmd: 300,message: message};/*** 调用服务器HandMsg方法发送消息*/connection.invoke("HandMsg", sendMessage).then(res => {const li = document.createElement("li");li.textContent = `我: ${message}`;document.getElementById("messagesList").appendChild(li);document.getElementById("msg").value = "";}).catch(err => console.error(err.toString()));event.preventDefault();});
</script>
</body>
</html>

浏览器需要在后面跟上参数Key 

http://localhost/?key=10086

 

5.完整代码地址

https://gitee.com/byte1026/signal-r.git

 

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

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

相关文章

MATLAB 二维平面绘图

x 0:0.01:2pi: 大家还记得这个是什么意思吧 就是0到2π 每次所取的数 是相差0.01进行选取的 ysin&#xff08;x&#xff09;: figure (这个意思就是建立一个幕布) plot&#xff08;x&#xff0c;y&#xff09; 这个主要是绘制当前的二维平面的图 但是大家会发现这张图里没有标…

反激开关电源输入电解电容选型及计算

输入电解电容波形如下 计算 1、输入电解电容经验选取法 当输入电压为220V20%&#xff08;AC176-264V&#xff09;时 按照输出功率选取&#xff1a;W/μF 耐压&#xff08;400V&#xff0c;输入176-264V最高DC峰值373V&#xff09; 当输入电压为11020%时&#xff08;AC88-132V…

windows服务器一台机器安装多个mysql实例

1、复制安装mysql安装包 2、修改配置文件信息 标注红色部分是需要修改成复制后的包信息 [mysqld] default-time_zone8:00basedirD:/tools/MySQL-Cluster/mysql-53306 datadirD:/tools/MySQL-Cluster/mysql-53306/data default-storage-engineINNODB sql-mode"STRICT_TRANS…

网络运维:企业数字化转型的基石

在数字化时代&#xff0c;网络已经成为企业运营不可或缺的一部分。网络运维作为确保网络稳定、安全和高效运行的关键环节&#xff0c;其重要性不言而喻。本文将探讨网络运维的重要性&#xff0c;并分析其在企业数字化转型中的作用。 网络运维的定义 网络运维&#xff0c;也称…

Amazon Systems Manager中补丁合规性定期扫描

问题 需要使用Amazon Systems Manager对EC2补丁合规性定期扫描。 步骤 点击如下入口界面&#xff1a; 权限使用默认配置&#xff0c;勾选“Scan instances for missing patches daily”每天扫描EC2实例是否存在补丁&#xff0c;来完成合规检查&#xff0c;选择所有实例&…

Zabbix自定义监控JAVA进程

一.定义脚本 二 .ZABBIX得agent允许以root身份执行 三. Zabbix测试自定item是否成功 四.ZABBIX服务端web添加新得item项 五.查看最新数据&#xff0c;取值成功

每日AI资讯-20240618

1. 3D 版 SORA 来了&#xff01; DreamTech 官宣了其高质量 3D 生成大模型 Direct3D&#xff0c;并公开了相关学术论文 Direct3D: Scalable Image-to-3D Generation via 3D Latent Diffusion Transformer。 链接&#xff1a;https://arxiv.org/abs/2405.14832 这是首个公开发布…

分享一下,如何搭建个人网站的步骤

在这段充满探索与创造的奇妙旅途中&#xff0c;我就像一位耐心的建筑师&#xff0c;在数字世界的荒原上精心雕琢&#xff0c;两周的时光缓缓流淌。每天&#xff0c;我与代码共舞&#xff0c;手执HTML、CSS与JavaScript这三大构建魔杖&#xff0c;一砖一瓦地筑起了梦想中的网络城…

JDK与JRE与JVM:它们之间的区别

JDK与JRE与JVM&#xff1a;它们之间的区别 JDK&#xff08;Java开发工具包&#xff09; JDK是JRE的超集&#xff0c;它包含JRE所拥有的一切以及编译器、调试器等开发工具。 JDK代表Java开发工具包。要在您的系统上安装Java&#xff0c;您需要首先在系统上安装JDK。 JDK包含编…

Blazor 中基于角色的授权

介绍 Blazor用于使用 .NET 代码库创建交互式客户端 Web UI。Microsoft 默认在 Blazor 应用程序中提供了一个用于身份验证和授权的身份框架。请注意&#xff0c;他们目前使用 MVC Core Razor 页面作为身份验证 UI。使用“Microsoft.AspNetCore.Identity.UI”包库来实现这一点。…

实战|YOLOv10 自定义目标检测

引言 YOLOv10[1] 概述和使用自定义数据训练模型 概述 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10&#xff0c;通过优化模型结构并去除非极大值抑制&#xff08;NMS&#xff09;环节&#xff0c;提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领…

基于STM32和人工智能的智能楼宇安防系统

目录 引言环境准备智能楼宇安防系统基础代码实现&#xff1a;实现智能楼宇安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能楼宇安防管理与优化问题解决方案与优化收尾与总结 1. 引言 随着物联网和人工智能技术的…

考研数学|做完《660》,做《880》还是吃力,怎么办?

880吃力说明基础还是不太扎实&#xff0c;建议配合知能行再刷880。 强化之前做660&#xff0c;然后在强化的时候再做880。 660整体难度属于基础阶段到强化阶段。而且是选填部分的题目&#xff0c;所以还是要做一些其他题 然后说一下推荐的习题册&#xff1a;基础不好先做1800、…

公司电脑加密软件——【中科数安】电脑文件资料透明加密,防泄密系统

中科数安电脑文件资料透明加密防泄密系统介绍 中科数安提供的电脑文件资料透明加密防泄密系统&#xff0c;是一款专为企业电脑终端设计的数据安全解决方案。该系统通过采用先进的透明加密技术和精细化的权限管理&#xff0c;旨在全方位保护公司电脑中存储、处理、传输的各类文…

在同一个 Blazor 应用中结合 SQL-DB 和 MongoDB

介绍 传统上&#xff0c;在单应用程序中&#xff0c;我们对整个应用程序使用单个数据库服务器。但是&#xff0c;我将 SQL 数据库和 MongoDB 结合在同一个应用程序中。此应用程序将是 RDBMS 和 No SQL 数据库的组合。我们将从头开始创建一个 Blazor 应用程序&#xff0c;并使用…

APS计划排程系统如何打破装备使用约束

APS计划排程系统是离散制造型企业在计划控制方向的重要支撑&#xff0c;它提供的是交期预测、订单排产计划、物料采购计划、人力分配计划等等。近些几年来&#xff0c;多品种、小批量、多订单的生产模式&#xff0c;让企业的计划员应接不暇、疲累不堪&#xff0c;传统的人工经验…

C++语法01 基本框架

目录 什么是 C &#xff1f; 新建源程序 保存源程序 程序基本框架 #include using namespace std; int main() return 0; 编译 运行 什么是 C &#xff1f; C语言&#xff0c;是基本的程序设计语言之一【程序设计语言&#xff0c;简单的来说就是编写代码来操控计…

数据库大作业——音乐平台数据库管理系统

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; 《数据库系统》课程设计 &#xff1a;流行音乐管理平台数据库系统&#xff08;本数据库大作业使用软件sql server、dreamweaver、power designer&#xff09; 目录 系统需求设计 数据库概念结构设计 实体分析 属性分…

升级必备!Win11专业版镜像下载地址:一键直达!

许多用户想要体验Win11专业版系统的新功能&#xff0c;但不知道Win11专业版在哪下载&#xff1f;接下来小编给大家分享最新的Win11专业版镜像&#xff0c;大家喜欢的话&#xff0c;一键点击下载即可&#xff0c;还可以打开【系统之家官网】寻找自己更喜欢的操作系统。 推荐下载…

大学物理(动量定理)

目录 冲量与动量 质点动量定理 质点系动量定理:​编辑 例题 ​编辑 例题 ​编辑 动量守恒定律:。 例题 ​编辑 例题 ​编辑 角动量 ​编辑 例题 ​编辑 力矩与角动量定理​编辑 角动量守恒定律: ​编辑 例题 冲量与动量 质点动量定理 质点系动量定理: 例题 例…