弹幕树洞项目功能新增篇

news/2024/11/18 21:30:22/文章来源:https://www.cnblogs.com/ZYPLJ/p/18434717

项目地址

项目后端地址:

  • https://github.com/ZyPLJ/ZYTteeHole

项目前端页面地址:

  • ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue

目前项目测试访问地址:

  • http://tree.pljzy.top/ 注意是http,输成https就访问到博客里面去了。

系列文章📖

  • .NET Core搭配Vue开源弹幕效果,实现一个评论小项目。好玩! - 妙妙屋(zy) - 博客园 (cnblogs.com) https://www.cnblogs.com/ZYPLJ/p/18403223

  • ZY知识库 · ZY - 弹幕树洞项目 (pljzy.top) https://www.pljzy.top/blog/post/2b33f54a84901364.html

前言

接上一篇文章,无聊的时候做了个树洞项目,其实一开始打算做真正的树洞,但是奈何前端技术有限,只能去GitHub找找灵感💡,不巧看到了Vue弹幕项目,看了一下觉得挺不错就拿来用了。

那做这个项目的初衷是自己有个地方能倾述自己的想法,能够让自己随便吐槽。这个项目目前是没有记录评论的ip和用户信息的,全是匿名的,所以可以随便吐槽(当然需要保持素质)。

本篇文章主要讲一讲我是怎么实现实时消息和人数的。

实时消息、人数展示实现

SignalR📖

既然是用.net写的项目,必然少不了 SignalR技术,最开始考虑使用消息实时性有如下几种方式:

  1. WebSocket

  2. SignalR

  3. 轮询

最后综合考虑 SignalR,主要是使用起来简单,并且我要实现的功能也不复杂。

那么就简单讲下SignalR是什么:

SignalR是一个由微软开发的实时通信框架,它简化了在C#中实现实时双向通信的过程。SignalR特别适用于需要实时交互的应用,如聊天程序、在线游戏、协同工作工具等。
SignalR 支持以下用于处理实时通信的技术:

  • WebSockets
  • Server-Sent Events
  • 长轮询
    SignalR 自动选择服务器和客户端能力范围内的最佳传输方法。

简单来讲可以使用SignalR快速开发实时通讯项目。

代码实现

后端代码

我使用的是.net 8创建的项目,好像自带SignalR,如果没有则需要去Nuget去下载。

Microsoft.AspNetCore.SignalR.Client

后端主要代码就是Hub类的实现

public class ChatHub:Hub  
{  private static int _connectionCount;  public async Task SendComment(string content)    {    ZyComments comment = new ZyComments  {  Content = content  };       //广播评论给所有连接的客户端    await Clients.All.SendAsync("ReceiveComment", comment);  }public override Task OnConnectedAsync()  {        // 每次客户端连接时增加计数  Interlocked.Increment(ref _connectionCount);  return base.OnConnectedAsync();  } public override Task OnDisconnectedAsync(Exception? exception)  {        // 每次客户端断开连接时减少计数  Interlocked.Decrement(ref _connectionCount);  // 广播连接数量变化    _ = BroadcastConnectionCount();  return base.OnDisconnectedAsync(exception);  } public int GetConnectionCount()  {       // 获取当前连接数量  return _connectionCount;  }    public async Task BroadcastConnectionCount()  {        await Clients.All.SendAsync("ConnectionCountChanged", _connectionCount);  }
}

简单描述就是用户评论的时候会调用SendComment方法将消息广播给当前连接的用户。然后在连接的时候将统计在线用户的计数++,断开连接的时候减少,并广播给连接的用户。

配置Program.cs文件:

builder.Services.AddSignalR();app.MapHub<ChatHub>("/ChatHub");

到此后端就编写完成了,是不是非常简单。

前端代码

安装客户端连接库:npm install @microsoft/signalr

import * as signalR from '@microsoft/signalr';const connectionCount = ref(0);// 连接数量
let connection: signalR.HubConnection | null = null;  connection = new signalR.HubConnectionBuilder()  .withUrl('https://localhost:44323/ChatHub') //后端地址 .build();//订阅评论消息事件
connection.on('ReceiveComment', (comment: any) => {    comments.value.push(comment);  const _danmuMsg =  {        ...}  danmaku.value.add(_danmuMsg)   
});// 订阅连接数量变化事件  
connection.on('ConnectionCountChanged', (count) => {  connectionCount.value = count;  console.log(`当前连接数量:${count}`);  
});//连接成功后调用BroadcastConnectionCount方法广播一次
connection.start().then(()=>{  connection.invoke('BroadcastConnectionCount')  .catch(err => console.error(err.toString()));  
}).catch(err => console.error(err.toString()));......

上述展示部分代码,也很简单,当用户创建连接后调用一次计数方法广播一次,并订阅评论消息和连接数量变化事件,然后当收到广播时执行相应的逻辑。

代码所在区域:TreeHoleVue/src/Views/Home.vue at master · ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue/blob/master/src/Views/Home.vue

效果展示💯

image

image

待完成的点🏷️

相关链接

  • 前端弹幕效果使用开源项目:https://github.com/hellodigua/vue-danmaku

  • ASP.NET Core SignalR 入门 | Microsoft Learn https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-8.0&tabs=visual-studio)

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

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

相关文章

Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览

Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览 Firepower Threat Defense (FTD) Software Release 7.6.0 Firepower 1100/3100/4100/4200/9300 Security Appliance 请访问原文链接:h…

【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发

我们创建了一个新的 Windows Dev Center 页面,简化了我们的 Getting Started with WinUI 文档,并与 Visual Studio 合作来改善开发人员在工作负荷和模板方面的体验。在 Build 2024 上,WinUI 团队宣布将重新关注 WinUI,将其作为我们推荐的原生 Windows 应用开发的首要应用开…

Windows10永久拒绝升级Win11

一、使用组策略阻止升级到windows11 需要专业版或企业版的Windows 10才能访问组策略编辑器。以下是操作步骤:单击开始菜单,输入gpedit.msc,打开本地组策略编辑器。 导航到“计算机配置”>“管理模板”>“Windows组件”>“Windows更新”>“适用于企业的Windows更…

arcgis怎样把面图层按另一面图层分割

摘自https://jingyan.baidu.com/article/6079ad0e9b5c8428fe86db70.htmlarcgis的桌面软件 主要应用于空间数据处理和管理,工作中往往会遇到要批量分割大量的面状数据,并且要按照其所处面的关系赋值。1、打开ArcMap软件,把两个面图层都加载到视图区域内,如下图2、在工具栏中…

10 #### 继承

继承 一定时刻知道,self是哪个类的对象。只要知道是哪个类的对象,就从哪个类开始进行查找 class base: # 父类,也可称为基类pass class Info(base): # 子类,也可称为派生类passclass base: # 父类,也可称为基类def f1(self):print(f1)class Info(base): # 子类,也可称为…

03 对象到底是个啥?

对象到底是个啥? # 2. 基于面向对象的方式实现上述功能 # 定义类 class MessageInfo:# 方法def send_email(to, body):msg = f给{to}发送邮件,内容:{body}print(msg)# 方法def send_dingding(to, body):msg = f给{to}发送邮件,内容:{body}print(msg)# 方法def send_wechat…

04 特殊方法`__init__(self)`

特殊方法__init__(self) class MessageInfo:# 初始化方法def __init__(self, city):self.city = cityself.company = 联通# 方法def send_email(self, to, body):msg = f给{to}发送邮件,内容:{body}print(msg)# 方法def send_dingding(self, to, body):msg = f给{to}发送邮件…

2025 年度技术规划

• quant 无代码图书配代码 • 小说大纲批量提取 • gh高星代码注释和漏洞检测 • 反编译 1000+ apk • 至少一个游戏辅助 • 漫画翻译 • 玄学pdf转md • dao改造 • pmp • kaggle master

机器学习第7次作业

机器学习作业7 学号:102102156 姓名:高涛 1. 各个分类器的分类性能比较 1.1 代码1.2 绘制结果2.各个分类器的分类性能比较 2.1 代码2.2 绘制结果

.net系列-ClosedXML,ExcelWorksheet,Workbook.Worksheets或ExcelPackage如何导出表格?如何自动宽度,根据内容调整行高和列宽

问题描述本文介绍两种.net导出表格的方案在我们使用.net的表格工具的时候,导出表格的宽度和高度默认的总是很窄,字体都挤在一起,如何让它自适应呢?下面介绍两个库的自适应代码写法使用ClosedXML也就是XLWorkbook github文档: https://github.com/ClosedXML/ClosedXML using…

图文并茂手把手教你macOS 上安裝并运行 .NET8应用(.net6也可以用哦)

快速起步 官方网址:https://learn.microsoft.com/zh-tw/dotnet/core/install/macos版本选择 installer版本:它包含了所有必须文件和帮助文档等,执行exe文件通过弹出的指示即可以安装软件。 binary版本:它是一个二进制包,里面包括了编译好的可以直接使用的程序,只需要把它…

Lab4 记录

Part A:无快照的KVServers KVServer整体结构如下每个KvServer对应一个Raft Server,该Raft Server可能是Leader或FollowerClient向KVServer发送请求,如果该KVServer对应的Raft Server不是Leader,直接返回Error,Clerk向其他KVServer发起请求 KVServer将命令提交到Raft Leader…