首页/新闻资讯/正文详情

NetCore+Web客户端实现gRPC实时推送

发布时间:2026/11/15 7:47:23 来源:云帆数科 栏目:资讯中心
NetCore+Web客户端实现gRPC实时推送
NetCoreWeb客户端实现gRPC实时推送引言在现代Web应用中实时推送是一个常见需求比如股票行情、聊天消息、系统通知等。传统的HTTP轮询方式效率低下且延迟高而WebSocket虽然解决了部分问题但在微服务架构中gRPC凭借其高性能、强类型和双向流特性成为实时推送的理想选择。本文将带你从零开始使用.NET CoreNetCore作为服务端结合gRPC实现实时推送并在Web客户端JavaScript中接收推送数据。我们将通过两个完整的代码示例来演示整个过程。## 技术栈与环境准备-服务端: .NET 8 (NetCore)-客户端: 纯HTML JavaScript (使用gRPC-Web)-通信协议: gRPC Protobuf-工具: Visual Studio 2022, Node.js (用于测试)在开始之前确保已安装- .NET SDK 8.0± Node.js 18## 1. 创建gRPC服务端项目首先我们创建一个gRPC服务端项目用于定义服务和推送逻辑。### 1.1 定义Protobuf协议创建一个名为ChatService的gRPC服务支持双向流推送。protobuf// chat.protosyntax proto3;package chat;// 聊天服务定义service ChatService { // 双向流客户端发送消息服务端返回实时通知 rpc ChatStream (stream ChatMessage) returns (stream Notification);}// 客户端发送的消息结构message ChatMessage { string user 1; // 用户名 string content 2; // 消息内容 int64 timestamp 3; // 时间戳毫秒}// 服务端推送的通知结构message Notification { string type 1; // 通知类型new_message, system string payload 2; // 通知内容JSON格式 int64 timestamp 3; // 时间戳}### 1.2 实现服务端逻辑在.NET Core中实现ChatService并添加实时推送功能。csharp// Services/ChatService.csusing Grpc.Core;using ChatGrpc; // 自动生成的代码namespace GrpcServer.Services;public class ChatServiceImpl : ChatService.ChatServiceBase{ private static readonly ListIServerStreamWriterNotification _clients new(); private static readonly object _lock new(); // 处理双向流接收客户端消息并广播通知 public override async Task ChatStream( IAsyncStreamReaderChatMessage requestStream, IServerStreamWriterNotification responseStream, ServerCallContext context) { // 将当前客户端加入广播列表 lock (_lock) { _clients.Add(responseStream); } try { // 持续读取客户端发送的消息 await foreach (var message in requestStream.ReadAllAsync()) { // 构造通知对象 var notification new Notification { Type new_message, Payload ${{\user\:\{message.User}\,\content\:\{message.Content}\,\timestamp\:{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}}}, Timestamp DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; // 广播给所有客户端包括自己 lock (_lock) { foreach (var client in _clients) { // 异步发送不等待 _ client.WriteAsync(notification); } } Console.WriteLine($收到消息: {message.User} - {message.Content}); } } catch (Exception ex) { Console.WriteLine($客户端断开连接: {ex.Message}); } finally { // 移除断开的客户端 lock (_lock) { _clients.Remove(responseStream); } } }}### 1.3 配置服务端启动在Program.cs中配置gRPC服务并启用gRPC-Web支持用于浏览器客户端。csharp// Program.csusing GrpcServer.Services;var builder WebApplication.CreateBuilder(args);// 添加gRPC服务builder.Services.AddGrpc();// 添加gRPC-Web支持必须builder.Services.AddGrpcWeb(o o.GrpcWebEnabled true);var app builder.Build();// 启用gRPC-Web中间件app.UseGrpcWeb();// 映射gRPC服务app.MapGrpcServiceChatServiceImpl().EnableGrpcWeb();// 添加静态文件支持用于提供HTML客户端app.UseDefaultFiles();app.UseStaticFiles();app.Run();## 2. 创建Web客户端Web客户端使用JavaScript通过gRPC-Web协议与服务端通信。这里我们使用grpc/grpc-js和grpc/proto-loader库需要Node.js环境打包或直接在浏览器中使用CDN。### 2.1 安装依赖bash# 初始化项目npm init -y# 安装gRPC-Web客户端库npm install grpc/grpc-js grpc/proto-loader### 2.2 编写HTML客户端创建一个简单的HTML页面实现消息发送和实时接收。html!-- wwwroot/index.html --!DOCTYPE htmlhtml langzh-CNhead meta charsetUTF-8 titlegRPC实时推送演示/title style #messages { height: 400px; overflow-y: scroll; border: 1px solid #ddd; padding: 10px; } .message { margin-bottom: 10px; } .user { font-weight: bold; color: #007bff; } .time { color: #666; font-size: 0.8em; } /style/headbody h1gRPC实时聊天/h1 div idmessages/div div input typetext iduserInput placeholder用户名 valueUser / input typetext idmessageInput placeholder输入消息... / button onclicksendMessage()发送/button /div !-- 引入gRPC-Web库 -- script srchttps://unpkg.com/grpc/grpc-js1.10.0/build/grpc.js/script script srchttps://unpkg.com/grpc/proto-loader0.7.10/build/index.js/script script // 定义gRPC连接 const host http://localhost:5000; // 服务端地址 const protoFile chat.proto; // 需要服务端提供proto文件 // 加载proto定义 const packageDefinition grpc.loadSync(protoFile, { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true }); const proto grpc.loadPackageDefinition(packageDefinition).chat; // 创建客户端 const client new proto.ChatService(host, grpc.credentials.createInsecure()); // 建立双向流连接 const call client.chatStream(); // 接收服务端推送的通知 call.on(data, function(notification) { const payload JSON.parse(notification.payload); const messagesDiv document.getElementById(messages); const msgElement document.createElement(div); msgElement.className message; msgElement.innerHTML span classuser${payload.user}/span span classtime${new Date(payload.timestamp).toLocaleTimeString()}/span div${payload.content}/div ; messagesDiv.appendChild(msgElement); messagesDiv.scrollTop messagesDiv.scrollHeight; }); // 处理错误和关闭事件 call.on(error, function(err) { console.error(gRPC错误:, err); }); call.on(end, function() { console.log(连接关闭); }); // 发送消息函数 function sendMessage() { const user document.getElementById(userInput).value || 匿名; const content document.getElementById(messageInput).value; if (!content) return; const message { user: user, content: content, timestamp: Date.now() }; // 通过gRPC流发送消息 call.write(message); document.getElementById(messageInput).value ; } // 按回车键发送 document.getElementById(messageInput).addEventListener(keypress, function(e) { if (e.key Enter) { sendMessage(); } }); /script/body/html## 3. 运行与测试### 3.1 启动服务端在服务端项目目录下执行bashcd GrpcServerdotnet run服务端将在http://localhost:5000启动。### 3.2 访问Web客户端在浏览器中打开http://localhost:5000你会看到聊天界面。打开两个浏览器窗口分别输入不同用户名发送消息后所有窗口都会实时收到推送。### 3.3 测试效果- 在窗口1输入用户A和消息HellogRPC!- 在窗口2输入用户B和消息收到- 两个窗口会立即显示对方发送的消息延迟通常在毫秒级。## 4. 关键点解析### 4.1 gRPC-Web的作用浏览器原生不支持HTTP/2和gRPC的二进制传输因此需要使用gRPC-Web协议进行适配。服务端通过EnableGrpcWeb()中间件将gRPC转换为gRPC-Web格式使得浏览器可以正常通信。### 4.2 双向流推送的优势-低延迟: 服务端可以立即推送数据无需客户端轮询。-节省带宽: 只在有数据时传输避免了HTTP长连接的头部开销。-强类型: 通过Protobuf定义数据结构减少解析错误。### 4.3 生产环境注意事项- 使用gRPC.Web库如Grpc.Net.Client.Web替代手动加载proto。- 添加认证和授权机制如JWT。- 使用连接池管理大量客户端连接。- 考虑使用Redis或Kafka实现服务间推送广播。## 总结本文通过一个完整的聊天示例演示了如何使用.NET CoreNetCore实现gRPC服务端并通过Web客户端JavaScript接收实时推送。我们涵盖了从Protobuf定义、服务端实现、客户端集成到实际运行测试的全过程。gRPC的实时推送能力不仅适用于聊天场景还可以扩展到物联网数据上报、金融行情推送、多人协作编辑等需要低延迟、高吞吐的领域。结合.NET Core的高性能和跨平台特性这一方案在微服务架构中具有极高的实用价值。希望这篇文章能帮助你快速上手gRPC实时推送技术并在实际项目中灵活运用。如果有任何问题欢迎在评论区交流讨论

相关推荐

2026豆包视频去水印怎么弄?最新实操方法全教程
2026豆包视频去水印怎么弄?最新实操方法全教程

日常使用豆包AI生成视频时,系统默认会在视频角落添加平台水印,虽然不影响基础观看,但用于个人素材归档、作品整理、日常收藏时,会影响画面完整性和观感。2026年豆包平台的水印规则、工具适配方式均有小幅更新,不少老旧… · 2026/11/15 7:47:22

AI大模型在建筑行业的智能解析与生成应用
AI大模型在建筑行业的智能解析与生成应用

1. 岗位背景与行业趋势建筑行业正经历数字化转型的关键阶段,AI大模型技术的引入正在改变传统设计、施工和运营模式。根据2023年行业白皮书显示,头部建筑企业AI技术应用率年增长率达47%,其中智能解析与生成类需求占比超过60%。这个岗位的出现&… · 2026/11/15 7:47:22

3分钟上手:OBS AI背景移除插件完整使用指南
3分钟上手:OBS AI背景移除插件完整使用指南

3分钟上手:OBS AI背景移除插件完整使用指南 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://gitcode.co… · 2026/11/3 1:51:18

贺光明有没有电工证,全国通用证书怎么考怎么用?
贺光明有没有电工证,全国通用证书怎么考怎么用?

贺光明有没有电工证,全国通用证书怎么考怎么用? 工地太忙根本没时间复习考试,这是很多像贺光明这样的电工师傅的共同心声。一边要赶工期,一边要应付考试,光是想想就让人头大。但你知道吗?现在特种作业操作证,尤其是电工证,是 全国通用… · 2026/11/15 7:47:10

南昌那里能办电工证千万别踩坑,实操考试心里没底怕挂科
南昌那里能办电工证千万别踩坑,实操考试心里没底怕挂科

南昌那里能办电工证千万别踩坑,实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。很多想报考南昌电工证的人,都经历过类似的焦虑,担心自己操作不熟练、考试不通过、钱白花、时间白浪费。别急,这正是我们今天要重点聊的点——… · 2026/11/15 7:47:10

工地太忙根本没时间复习考试?专业电工证考试科目通过率揭秘
工地太忙根本没时间复习考试?专业电工证考试科目通过率揭秘

工地太忙根本没时间复习考试?专业电工证考试科目通过率揭秘 工地太忙根本没时间复习考试?这几乎是所有一线电工兄弟的共鸣。特别是在许昌房建项目上,电工的岗位责任重大,但考试压力却常常让人措手不及。专业电工证考试科目到底难不难?通过率又如何?本文… · 2026/11/15 7:47:10

安徽电工证六年复审怎么弄?全国通用怕被中介坑的看过来
安徽电工证六年复审怎么弄?全国通用怕被中介坑的看过来

安徽电工证六年复审怎么弄?全国通用怕被中介坑的看过来 你是不是正愁不知道哪里去报名安徽电工证六年复审?怕被中介忽悠、怕交了钱白忙一场?别急,这篇文章就是为像你这样的人准备的,手把手教你避坑,顺利搞定复审,还能搞懂这个证在全国是不是真的通用。… · 2026/11/15 7:47:10

电工证不全就别想上岗!黄振国电工证多少钱怎么考
电工证不全就别想上岗!黄振国电工证多少钱怎么考

电工证不全就别想上岗!黄振国电工证多少钱怎么考 你是不是正在找工作,却因为没有特种作业证被拒?特别是现在电工证越来越重要, 黄振国电工证多少钱… · 2026/11/15 7:47:10

考电工证有什么不同 真实经历告诉你外省证怎么转
考电工证有什么不同 真实经历告诉你外省证怎么转

考电工证有什么不同 真实经历告诉你外省证怎么转 之前考的证在外省能不能转过来,这几乎是每个准备考电工证或者已经拿到证书的人员最关心的问题之一。我之前在南阳卧龙区做房建工程,手上有一张河南的低压电工证,但后来去深圳工作时才发现,虽然证书在老家… · 2026/11/15 7:46:10

长春初级电工证怎么考?通过率揭秘全在这里
长春初级电工证怎么考?通过率揭秘全在这里

长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50

国内电工证报考条件与考试时间
国内电工证报考条件与考试时间

低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50

电工作业时如何断电?电子证书到底能不能全国通用?
电工作业时如何断电?电子证书到底能不能全国通用?

电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50

长春初级电工证怎么考?通过率揭秘全在这里
长春初级电工证怎么考?通过率揭秘全在这里

长春初级电工证怎么考?通过率揭秘全在这里 之前考的证在外省能不能转过来?这几乎是每个想从事电工工作的人都会问的问题。特别是那些在外地打拼多年、手里握着一张“外地电工证”的人,到了长春想继续干这一行,第一反应就是“我的证能用吗?”。今天我们就… · 2026/11/15 0:00:50

国内电工证报考条件与考试时间
国内电工证报考条件与考试时间

低压电工证怎么考?学历不高也能报名,官方报名入口全在这 你是不是经常听说“电工证是入行门槛”,但又担心自己学历不够、经验不足,根本报不了名?别急,今天就带你从零了解【国内电工证】的报考流程、考试内容,还有怎么在 官方报名入口… · 2026/11/15 0:00:50

电工作业时如何断电?电子证书到底能不能全国通用?
电工作业时如何断电?电子证书到底能不能全国通用?

电工作业时如何断电?电子证书到底能不能全国通用? 实操考试心里没底怕挂科,特别是电工作业时如何断电这一操作,不仅关系到你能不能拿到证书,更关系到以后能不能顺利上岗。很多人觉得这不过就是“断个电”,但其实这里面的门道可不少,稍有不慎就可能出错… · 2026/11/15 0:00:50

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 1:51:20

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 4:02:19

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/15 3:02:05

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码