(附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR)

参考文章

搭建文章


gitte源码

在线体验

可以注册两个号来测试

演示图:

一. 整体介绍

  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。

  内容有:

    ①:Hub模型的方法介绍

    ②:服务器端代码介绍

    ③:前端vue3 安装并调用后端方法

    ④:聊天室样例

整体流程:

1、进入网站 -> 调用连接 SignalR 的方法

2、与好友发送消息 -> 调用 SignalR 的自定义方法

 

前端通过,signalR内置方法 .invoke()  去请求接口

3、监听接受方法(渲染消息)

通过 new signalR.HubConnectionBuilder().on("接受方法") 这个函数

然后将接受的消息 存放到数组里 

 再 v-for 将数据渲染出来

4、退出浏览器或退出登录,触发 “连接终止时调用” (OnDisconnectedAsync)

修改登录状态为 离线

        /// <summary>/// 连接终止时调用。/// </summary>/// <returns></returns>public override Task OnDisconnectedAsync(Exception? exception){var httpContext = Context.GetHttpContext();var username = httpContext.Request.Cookies["username"];if (username == null){throw new Exception("系统异常连接失败");}// 修改用户登录状态_ChatLoginService.Update(s => s.ChatUserName == username,f => new ChatUser{Status = 0});var user = clientusers.Where(p => p.ConnectionId == Context.ConnectionId).FirstOrDefault();判断用户是否存在,否则添加集合if (user != null){clientusers.Remove(user);}return base.OnDisconnectedAsync(exception);}

在文件夹 ARW-vue-main\src\views\tool\chat 中的 index.vue 是简易版的demo

可以先把这个搞明白,后面会很好理解

这个对应的Hub 是 MessageHub 

二. Hub模型的方法介绍

继承成Hub类,所以可以Override三个方法:

  (1). OnConnected:连接成功时调用

  (2). OnDisconnected:连接断开时调用

  (3). OnReconnected:重连时调用

我这里用于 修改用户登录状态 在线人数列表...


使用Clients对象进行调用,Clients对象下的属性和方法有:

(1). 向指定人发送,一对一:Client(string connectionId)

(2). 向某个组发送:Group(roomName)

(3). 进入某个房间:Group.AddToGroupAsync(connectId, roomName)

三. 服务器端代码介绍

        好友聊天思路详细讲解:

        /// <summary>/// 好友发送信息/// </summary>/// <param name="user"></param>/// <param name="message"></param>/// <returns></returns>public async Task SendFriendsChat(string selfConnectionId, string connectId, string sender, string receiver, string message){if (string.IsNullOrEmpty(connectId)){throw new CustomException("好友不在线,请留言!");}// 服务端主动调用客户端的方法// 向指定用户(connectId)发送指定消息// 监听接受方法("ReceiveMessage")来获取消息 -> ( new { sender, receiver, message } )await Clients.Client(connectId).SendAsync("ReceiveMessage", new { sender, receiver, message });await Clients.Client(selfConnectionId).SendAsync("ReceiveMessage", new { sender, receiver, message });}

我们直接手撕源码,先看这个方法的参数 一共有5个

参数说明: connectId-> 在连接SignalR时会给该用户生成一个连接Id,并存在在线用户列表

后面统称 "连接ID"

1、selfConnectionId -> 自己的连接ID

2、connectId -> 对方的连接ID

3、sender -> 发送者的用户GUID

4、receiver-> 接收者的用户GUID

5、message -> 发送的消息

首先我们给发送消息,必须先知道对方的 connectId

才能够调用 Clients.Client(connectId).SendAsync(.......)

Q:为什么需要自己的连接ID呢?

A:因为给对方发送,对方能够接收到消息,但自己是接收不到的,所以这里要给自己也发一份。因而需要传自己的连接ID。

Q:如何区分是谁发送的消息?

A:这里我用的是 接收者 和 发送者 做的判断,这里需要捋一捋思路,所以这里要传发送者的GuId 和 接收者的GuId。(发送消息时也带 sender 和 recevier)

 下图是我在渲染聊天列表时做的判断:

Q:如果好友不在线,获取不到对方的连接ID怎么办?

A:这个情况再去请求Hub接口是会报错的,因为对方的连接Id是空的。我的做法是每次发送一条消息就会存进数据库里嘛,然后判断一下对方是否在线,不在线就获取他们之间的对话的最新一条消息,这里sql比较复杂,感兴趣的可以看看这个。

看懂这个方法后,来看一下 前端调用

基础使用

对前端感兴趣的可以看一下源码

        群聊聊天思路详解:

        /// <summary>/// 进入指定组/// </summary>/// <param name="connectId"></param>/// <param name="roomName">组的名称</param>[HubMethodName(nameof(EnterRoom))]public void EnterRoom(string connectId, string roomName){Groups.AddToGroupAsync(connectId, roomName);}/// <summary>/// 群聊天(发送信息)/// </summary>/// <param name="roomName"></param>public async Task SendGroupChat(string roomName, string groupGuId, string selfConnectionId, string senderId, string receiver, string message){var guid = senderId.ParseToLong();var groupguid = groupGuId.ParseToLong();var sender = _ChatLoginService.FindUserByGuid(guid).Result;await Clients.Group(roomName).SendAsync("groupMessages", new { roomName, sender, receiver, message });_GroupUserService.Update(s => s.GroupGuId == groupguid,f => new GroupUser{IsRead = false});//await Clients.Client(selfConnectionId).SendAsync("groupMessages", new { sender, receiver, message });}}

我们继续手撕源码,先看这个方法的参数 一共有6

参数说明: roomName -> 在SignalR中组名,如果没有这个组名则添加并进入列表,有则加入组

后面统称 "组"

1、roomName -> 组名

2、groupGuId -> 群聊的GUID

3、selfConnectionId -> 自己的连接ID

4、senderId -> 发送者的用户GUID

5、receiver-> 接收者的GUID(这里指群聊的GUID)

6、message -> 发送的消息

Clients.Group(roomName).SendAsync("接受方法名",发送的消息)

首先要 进入到房间内:

把自己的连接ID放进去,以及群聊名称

Groups.AddToGroupAsync(connectId, roomName);

在群聊发送消息,需要做到:

1、通过 roomName 发送消息到这个房间

2、通过 groupGuId 来修改用户是否已读

3、通过 senderId 来判断是否自己发的,不是则展示群成员发的头像和所发的消息

4、通过 receiver 来判断这个群聊是否为指定的群

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

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

相关文章

A股全市场股票历史行情Level2快照高频数据

A股全市场股票Level2快照高频数据(2010年开始) 快照行情又称切片(snapshot)行情&#xff0c;如其名&#xff0c;是对tick行情数据的某一个时刻的切片数据。例如现在常见的期货500ms一笔的行情&#xff0c;就是每500ms&#xff0c;在这时间段内的最高价、最低价、成交量等汇总成…

数据分析之数据可视化

数据可视化主要借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。通过图表使冗长的数据表达更加形象化&#xff0c;可以把问题的重点有效传递给观者。 一 看懂不同类型的图表 在实现数据可视化之前&#xff0c;我们首先要了解有哪些图表类型&#xff0c;常见的图表可参…

高大上的数据可视化图表,只需6步就能完成

一份高质量的数据可视化图表&#xff0c;能够让你清晰、全面地传达出数据信息&#xff0c;成为你工作、学习、竞赛的助推器&#xff01; 因此&#xff0c;一款功能强大的可视化软件显得尤为重要&#xff01; 最近博主在用的百度 Sugar BI&#xff0c;里面的海量图表模板可以帮…

超级干货:手把手教你如何实现数据可视化

目录&#xff1a; 一、引言二、数据可视化1、数据可视化是什么&#xff1f;2、数据可视化的目的3、使用场景4、数据可视化工具5、ECharts 可视化工具1、什么是ECharts2、如何使用&#xff08;1&#xff09;下载&#xff08;2&#xff09;引入ECharts&#xff08;3&#xff09;使…

数据可视化就应该这么做!

整理&#xff1a;微信公众号5WPuss 今天分享一篇关于数据可视化设计的好文 前排提示&#xff0c;文末送2本Pandas相关的好书~ 在如今的工作中&#xff08;尤其是 B 端&#xff09;越来越多的会开始出现数据可视化的身影&#xff0c;对于一部分小伙伴来说这个概念是较为陌生的&a…

超级干货 :手把手教数据可视化工具Tableau

前言 数据的世界正在发生急剧变化&#xff0c;任何人都应该访问自己需要的数据&#xff0c;并具备获取任何数据的洞察力&#xff0c;而tableau正是帮我们洞察数据的好帮手。 Tableau作为BI tool leader ( 2016 Gartner BI chart), 它不仅是一款可视化软件&#xff0c;还具备不可…

阿里巴巴开源的免费数据库工具Chat2DB

Chat2DB 是一款由阿里巴巴开源的免费数据库工具&#xff0c;它为开发人员提供了一个强大且易于使用的平台&#xff0c;用于存储和查询数据。与传统的数据库工具相比&#xff0c;Chat2DB 具有以下特点和优势&#xff1a; 多数据库支持&#xff1a;Chat2DB 可以与多种类型的数据库…

猿创征文|实战开发openGauss DataStudio的sql联想结构

前段时间正好完成国产数据库openGauss DataStudio的sql语句表提示功能优化&#xff0c;借此机会来给大家分享一下我的开发过程以及经验。 项目暂时还处于结项阶段&#xff0c;如果大家在中间有更好的解决思路或者经验&#xff0c;非常欢迎大家前来讨论交流&#x1f60e; 实战开…

历史最全ChatGPT、LLM相关书籍、论文、博客、工具、数据集、开源项目等资源整理分享

ChatGPT是一个生成型预训练变换模型&#xff08;GPT&#xff09;&#xff0c;使用基于人类反馈的监督学习和强化学习在GPT-3.5之上进行了微调。这两种方法都使用了人类训练员来提高模型的性能, 通过人类干预以增强机器学习的效果&#xff0c;从而获得更为逼真的结果。在监督学习…

基于 ChatGLM-6B 搭建个人专属知识库

之前树先生教过大家如何利用微调打造一个垂直领域的 LLM 专属模型。但是微调一方面需要专业知识&#xff0c;通常需要很多计算资源和时间&#xff0c;以便在不同的超参数设置上训练多个模型并选择最佳的一个&#xff0c;另一方面动态扩展比较差&#xff0c;新增和修改原有的数据…

SpringBoot+Vue+WebSocket编写简单在线聊天室

WebSocket 简单入门 websocket 应用场景&#xff1a;社交订阅、多玩家游戏、协同编程/编辑、点击数据流、股票基金报价、体育实况更新、多媒体聊天、基于位置的应用、在线教育等等。 参考&#xff1a;https://blog.csdn.net/resilient/article/details/85613446 online-chatroo…

解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。

1、在Chrome地址栏中输入:chrome://net-internals/#hsts; 进入Domain Sercurity Policy界面。 2、在下图中输入二级域名查询是否使用了强制 HTTPS 请求。3、如果有查询结果&#xff0c;则在最下方的delete栏处&#xff0c;删除该域名的信息 4、再次查询&#xff0c;如下图所示&…

Win11系统电脑浏览器打开页面时显示无法访问此页面

无法获取域名的正确IP地址&#xff0c;由此可见网页无法打开的问题很可能出现在DNS设置上了。打开网页出现“无法访问此页面”&#xff0c;可以通过更改DNS服务器地址解决该问题 1、首先打开系统设置 2.【控制面板】-【网络和Internet】-【网络连接】 3.选择使用下面的DNS服务…

浏览器无法访问此网站该如何处理?

打开浏览器搜索内容&#xff0c;发现浏览器网页无法显示&#xff0c;出现了如下的提示。然后本篇文章主要写给浏览器无法使用的人提供一些解决办法。 谷歌浏览器&#xff08;老版本&#xff09; 打开谷歌浏览器&#xff0c;首先进入浏览器点击右上方三个点&#xff0c;找到“…

无法访问此网站网址为 http://localhost:6000/xxx 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。 ERR_UNSAFE_POR

无法访问此网站 问题: 自己写的WEB服务, 端口6000在浏览器上怎么请求都无法访问此网站, 如下图: 在谷歌上访问: 在火狐上访问: 但是发现一个问题就是在Postman和IE里边测试是可以用的 原因&#xff1a;就是因为浏览器出于安全考虑, 会设置非安全不能访问的端口。 所以在平常开…

(2022年12月)解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常

1、问题描述&#xff1a; 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的&#xff0c;因此&#xff0c;此网页稍后可能会恢复正常 2、概念解释&#xff1a; HSTS&#xff1a;HSTS 是 HTTP 严格传输安全&#xff08;HTTP Strict Transport Security&…

谷歌浏览器提示,您目前无法访问,因为此网站使用了HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复

在本地建网站时&#xff0c;使用本地hosts转向域名&#xff0c;使用谷歌浏览器访问时出现了&#xff0c;您目前无法访问&#xff0c;因为此网站使用了HSTS。网络错误和攻击通常是暂时的&#xff0c;因此&#xff0c;此网页稍后可能会恢复。 解决方法&#xff1a; 1.在谷歌浏览…

Chrome浏览器出现无法访问此网站/无法显示此网页的错误,怎么解决?

出现"无法访问此网站"或"无法显示此网页"的错误&#xff0c;有很多原因会导致这个问题发生&#xff0c;下面说明如何解决这个问题。 升级Chrome到最新版本&#xff0c;首先确认您的Chrome已经升级到了最新的稳定版&#xff0c;将Chrome升级到最新版本&…

网络连接正常但百度网页打不开显示无法访问此网站解决方案

电脑连接网络正常但百度网页打不开显示无法访问此网站 一、近期博主连接校园网之后打开百度发现无法访问&#xff0c;且显示下面图片中的错误。 二、然后Windows网络诊断发现是DNS没有响应。 三、博主选择重置电脑DNS设置。 四、最后正常访问百度。

电脑网络连接正常,微信、QQ能正常使用,但无法访问网页

电脑网络连接正常&#xff0c;微信、QQ能正常使用&#xff0c;但无法访问网页 问题描述&#xff1a;可能是在上网时动了代理服务器的地址&#xff0c;虽然过后把代理服务器给取消了&#xff0c;但电脑里的IE&#xff0c;360浏览器&#xff0c;Chrome都登不了网页&#xff0c;但…