Blazor学习之旅(11)简易SignalR聊天室
大家好,我是Edison。
很久没有更新Blazor这个系列了,在上一篇我们学习了如何实现多语言和本地化,这一篇我们了解下Blazor+SignalR结合。
什么是SignalR?
ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加实时 Web 功能。实时 Web 功能使服务器端代码能够将内容推送到客户端。适合 SignalR 的候选项:
- 需要从服务器进行高频率更新的应用。示例包括游戏、社交网络、投票、拍卖、地图和 GPS 应用。
- 仪表板和监视应用。示例包括公司仪表板、即时销售更新或旅行警报。
- 协作应用。协作应用的示例包括白板应用和团队会议软件。
- 需要通知的应用。社交网络、电子邮件、聊天、游戏、旅行警报和很多其他应用都需使用通知。
接下来,我就以一个简易的SignalR实现的聊天室为例,介绍如何通过结合Blazor+SignalR来做一个超快速实现的实时应用。
在Blazor中实现本地化的步骤
(1)准备工作
假设我们已经有了一个Blazor Server应用程序,你可以从这里获取Code:https://github.com/Coder-EdisonZhou/BlazorSamples。
(2)添加SignalR客户端
在项目的Nuget管理器中搜索并安装:Microsoft.AspNetCore.SignalR.Client。
这里选择的是6.0.20版本,你需要选择与你的应用框架匹配的版本。
(3)添加SignalR Hub(集线器)
添加一个Hubs目录,在该目录下可以存放我们自定义的多个SignalR Hub。这里我们添加一个 MyChatHub,其代码如下:
using Microsoft.AspNetCore.SignalR; namespace EDT.BlazorServer.App.Hubs;
public class MyChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
(4)为SignalR添加必要服务
为了SignalR的正常使用,我们需要在Program.cs中做一些必要服务的添加,比如响应压缩中间件(ResponseCompression) 和 EndPoint。
......
using Microsoft.AspNetCore.ResponseCompression;
using EDT.BlazorServer.App.Hubs;
// Add Response Compression for SignalR
builder.Services.AddResponseCompression(opts =>
{
opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/octet-stream" });
});
......
app.MapBlazorHub();
app.MapHub<MyChatHub>("/mychathub"); // Add Map for SignalR Hubs
app.UseResponseCompression(); // Use Response Compression for SignalR
......
(5)创建聊天室Razor组件页面
在Pages目录下新建一个Razor组件,暂且命名为 ChatRoom.razor。
@page "/chatroom"
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager Navigation
@implements IAsyncDisposable <PageTitle>My ChatRoom</PageTitle> <div class="form-group">
<label>
User:
<input @bind="userInput" />
</label>
</div>
<div class="form-group">
<label>
Message:
<input @bind="messageInput" size="50" @onkeypress="Enter" />
</label>
</div>
<button @onclick="Send" disabled="@(!IsConnected)">Send</button> <hr> <ul id="messagesList">
@foreach (var message in messages)
{
<li>@message</li>
}
</ul> @code {
private HubConnection? hubConnection;
private List<string> messages = new List<string>();
private string? userInput;
private string? messageInput; protected override async Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/mychathub"))
.Build(); hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
{
var encodedMsg = $"{user}: {message}";
messages.Add(encodedMsg);
InvokeAsync(StateHasChanged);
}); await hubConnection.StartAsync();
} private async Task Send()
{
if (hubConnection is not null)
{
await hubConnection.SendAsync("SendMessage", userInput, messageInput);
}
} private async Task Enter(KeyboardEventArgs e)
{
if (e.Code == "Enter" || e.Code == "NumpadEnter")
{
await this.Send();
}
} public bool IsConnected =>
hubConnection?.State == HubConnectionState.Connected; public async ValueTask DisposeAsync()
{
if (hubConnection is not null)
{
await hubConnection.DisposeAsync();
}
}
}
(6)效果演示
如下图所示,用浏览器打开两个ChatRoom,输入用户名和消息点击Send按钮,既可有一个实时聊天室的效果:
小结
本篇,我们在Blazor中结合SignalR实现了一个超简单的聊天室效果,虽然只是一个很简单的聊天室,但却可以通过SignalR这种方式快速的实现类似的实时应用。
参考代码
GitHub:https://github.com/EdisonChou/BlazorSamples/tree/main
参考资料
Microsoft Learning,《结合使用ASP.NET Core SignalR 和 Blazor》
Blazor学习之旅(11)简易SignalR聊天室的更多相关文章
- SignalR 聊天室实例详解(服务器端推送版)
翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room (在这里可以下载到实例的源码) Asp.Net Si ...
- SignalR学习笔记(一) 简单聊天室
什么是ASP.NET SignalR? ASP.NET SignalR是一个方便程序员添加实时网络通信功能的类库.所谓的实时网络通信功能(Real-time Web Functionality)就是需 ...
- [XMPP]简易的聊天室实现[二](使用CocoaAsyncSocket)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- C 基于UDP实现一个简易的聊天室
引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...
- redis实现简易在线聊天室
redis_flask简易聊天室 项目构建 这时一个基于Redis数据库的简单小项目,使用redis缓存数据,并通过flask部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...
- golang简易版聊天室
功能需求: 创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊 效果图: 群聊: 单聊: 服务端: package main import ( "fmt" ...
- 笔记-JavaWeb学习之旅11
请求转发:一种在服务器内部的资源跳转方式 使用步骤 1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path) ...
- c# signalr聊天室开源资料
SignalR+LayIM源码: http://www.cnblogs.com/panzi/p/5742089.html 钉钉客户端源码: http://www.cnblogs.com/loveson ...
- [XMPP]简易的聊天室实现[一]
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- .net SignalR 聊天室
代码地址:https://gitee.com/srnsrn/netSignalr.git 运行项目打开多个页面 私密聊天
随机推荐
- 【Java】Java UDP 套接字编程乱码问题
零.发现问题 用Java写了个UDP收发程序,发现中文有问题! package socket; import java.io.IOException; import java.net.Datagram ...
- Audio DSP boot 过程
在智能手机或智能手表等SoC上通常有一块专门的audio DSP(简称ADSP)来做音频处理.要做音频处理,ADSP首先要被boot起来.本文以CEVA BX2为例来讲讲ADSP的boot过程. 在上 ...
- idea插件开发踩坑记录
问题 build.gradles.kts配置文件中全部爆红,提示Cannot access script base class 'org.gradle.kotlin.dsl.KotlinBuildSc ...
- Electron 开发:获取当前客户端 IP
Electron 开发:获取当前客户端 IP 一.背景与需求 1. 项目背景 客户端会自启动一个服务,Web/后端服务通过 IP + port 请求以操作客户端接口 2. 初始方案与问题 2.1. 初 ...
- Spring Cloud Gateway网关
一.Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求由(路由)转发到对应的微服务 网关的执行过程:当一个请求到达网关,网关利用断言,查看该请求是 ...
- 🎀windows-剪切板
简介 Windows 剪贴板是一个临时存储区域,它允许用户在不同应用程序之间复制和粘贴文本.图像和其他类型的数据.从 Windows 10 开始,微软引入了一个改进的剪贴板功能,称为剪贴板历史记录,它 ...
- LangPipe大语言模型Pipeline应用框架案例介绍
LangPipe介绍 LangPipe是一个轻量级的大模型工作流应用框架LangPipe,可以轻松解决下面各种问题: text generation(文本生成) chat with LLM(与LLM对 ...
- win10、win11环境下查看IIS里各项目资源占用情况
参照链接: [如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?] - 走看看 (zoukankan.com) 概念: 简单理解IIS应用程序池 应用程序池可以看成是计算机分配给Web应 ...
- SQL 查询强化 - 数据准备
最近要搞新的项目了, 我的 BI 报表这块, 我感觉, 可能又要写sql, 对于一些简单的 查询, 表连接我还应付得来, 如果涉及多个表的, 什么子查询嵌套, 自定义函数, 加上控制流...就感觉就不 ...
- M系Mac原生运行《原神》保姆级教程!手把手教你零门槛畅玩手游!
Apple Silicon芯片的进化正在重塑M系列Mac的跨平台能力.通过开源工具PlayCover,开发者社区成功突破系统限制,让<原神 >等热门手游在M1/M2/M3/M4芯片设备上流 ...