Web实时通信,SignalR真香,不用愁了

前言

对于B/S模式的项目,基础的场景都是客户端发起请求,服务端返回响应结果就结束了一次连接;但在很多实际应用场景中,这种简单的请求和响应模式就显得很吃力,比如消息通知、监控看板信息自动刷新等实时通信场景,小伙伴们肯定会想到轮询或WebSocket的方式来搞定,可是单纯用轮询的方式有点耗资源,只用WebSocket的方式又有些浏览器或其他客户端不支持,所以如果自己从头来写的话,很多细节还得做处理;这个时候SignalR就该站出来了,封装的很给力,直接使用就行。

正文

1. SignalR简介

SignalR是一个开源的库,跨平台;让Web应用与其他应用通讯变得很简单,Web服务端可以实时的将内容推送给对应的客户端,客户端发送的信息也可以实时到其他客户端

SignalR提供了一种远程过程调用(RPC)的方式,使得客户端可以调用服务器的方法,同样在服务器端的方法中也能调用客户端的方法

1.1 SignalR的通信方式

SignalR支持如下的方式实现实时通信:

  • WebSockets:是一种在单个TCP连接上进行全双工通信的协议,使得服务器和浏览器的通信更加简单,服务端可以主动发送信息。

  • Server-Sent Events:SSE 与 WebSocket 作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。WebSocket是双向的,而SSE是单向的。

  • Long Polling(长轮询) :和传统的轮询原理一样,只是服务端不会每次都返回响应信息,只有有数据或超时了才会返回,从而减少了请求次数。

SignalR会自动选择服务器和客户端能力范围内的最佳通信方式(是不是很优秀) ,当然也可以手动指定。

1.2 SignalR的应用场景

其实对于Web模式下的实时通信,SignalR用上试试,感觉还是很给力的。

  • 服务端主动推送信息;比如发送公告场景;

  • 监控或看板数据实时显示;比如监控系统实时展示分布到各个客户端上的数据;

  • 服务端和客户端交互;比如客服系统的聊天场景。

理论大概先说这么多,接下来就用实例演示一波。

2. 案例演示

2.1 SignalR服务端

这里我把SignalR的服务端寄宿在WebAPI项目中了,实际可以根据需要寄宿到对应的项目(窗体应用、后台服务),当然也可以单独为其创建一个项目,但代码编写都基本一样。

  • 创建一个WebAPI项目,引入对应的Nuget包

  • 编写自己的SignalR Hub

    Hub就是一个类,只是里面编写的方法客户端可以远程调用到(原理后续咱们一起读读源码);同样在服务端也可以远程用客户端的方法,这样就使得实时通信变得简单便捷了。

    e2f6ce1e4b6a42ce3411ee16fefbc620.png
  • 在Startup.cs文件中注册相关服务及管道

    8f1f6dcbee56d04bb0991b2754dae175.png
  • 业务API编写,推送消息

    其实上面的步骤已经完成SignalR服务端搭建,接下来需要加入一些业务模拟,比如模拟消息推送,方便演示;如下编写API:

    13e7758e451b2cc7dc44158d6afb83a5.png

    到这服务端的业务就写完了,接下来就是开始编写客户端。

2.2 JS客户端

Js客户端使用Vue组件,绑定数据方便;放在WebApi项目的wwwroot目录下,和WebAPI一起共用服务器启动,所以就不用考虑跨域问题。如果前端分开部署,需要在SignalR寄宿的项目中配置跨域。具体步骤如下:

  • 获取signalr封装好的js文件,开箱即用

    npm init -y
    npm install @microsoft/signalr

    npm将包内容安装在当前执行命令目录下的node_modules\@microsoft\signalr\dist\browser文件夹中。在服务端项目中创建wwwroot/signalr文件夹,将下载下来signalr.js文件复制到wwwroot\signalr文件夹即可;

    采用npm的方式需要提前安装node,也可以直接下载。不过在真正前端项目中,npm安装完直接引入就使用了,不需要来回拷贝,这里只是演示。

  • 编写index.html

    这里把所有的静态文件都放在WebAPI项目的wwwroot目录下,到时候一块共用服务器;另外使用到Vue和异步请求,所以需要引入Vue和axios的js文件,这里都是通过CDN地址形式引入,并没有下载到本地,真实项目中肯定是要自己管理的。如下:

    42323f14d90be376ad9367ca82811513.png

    关键脚本逻辑,如下:

    99bb336e006f91f0cf643ac888d9d7af.png

    注:这里需要注意客户端指定的方法名和接到的参数的解析,是驼峰的形式。

  • 运行起来演示发布效果,如下:

    18893f5fdc2e66692bc368e28f7cbe02.png

    是不是很简单就实现了推送效果,根本就没咋敲代码,是不是很香。到这小伙伴会问,其他客户端类型支持吗?答案是肯定的,什么后台服务或窗体都行,接下来就搞个窗体的客户端。对了,Java客户端也支持,只管放心用,不仅仅是.Net。

    注:有小伙伴自己开发运行的时候访问不到页面,那因为WebApi项目中默认不支持静态页面访问,需要加上对应的中间件,如下:

    136e0ee320a7fe790d201fd8ab8187e3.png
2.3 WinForm客户端

布局很简单,在窗体中直接搞个文本框显示消息就行;小伙伴们别嫌弃啊,主要体现的是流程,界面美化小伙伴们自己想怎么搞都行。

53b51f0ae2cb3a663dd025e7685827ed.png

核心代码如下:

bb02ee8e98f50194cde771bbf902265a.png

客户端又很轻松的搞定了,运行起来看看效果:

先把服务器运行起来(这里是WebApi项目),然后窗体程序运行起来:

7becccad841533a1e743db3c77d59655.png

实现起来是不是很给力,现在不用再苦恼对于B/S模式下,服务器端主动的场景了吧;

2.4 客户端主动上报数据信息,实时显示到其他客户端

上面的推送场景是服务端主动, 但有很多场景是客户端主动上报数据,需要实时显示到数据看板或显示到其他客户端界面。比如一些监控系统,需要实时显示设备状态;再比如类似游戏的场景,其中一个客户端发生改变,需要实时显示到其他客户端。

对应客户端主动上报的场景,需要通过服务器转发,因为客户端之间没有建立连接,只有服务器知道有多少客户端已连上,所以这个时候需要在服务端上增加一个方法供客户端调用,如下步骤:

  • 服务端在自定义的MyHub中增加一个方法

    2da4b9945c774d8a8d2961a0729772d7.png
  • 这里模拟的是在窗体客户端发生数据改变,实时显示到其他客户端

    6e6a69730610be4c8d3a57fef03c791c.png

    在窗体客户端按钮的点击事件中直接调用服务端的方法,并传递更新的信息,由服务端调用客户端的方法再转发给其他客户端

  • 客户端的更新方法,这里只在Js客户端实现,其他客户端如果需要,同理

    b5a85c2ea86567f21af98aa7380275b8.png
  • 运行起来看效果

    ec07cc99b78cfc101f8da7e6669f9dcd.png
2.5 小结

上面列举了两个场景,服务器主动推和客户端主动推两种情况,基本上可以满足大多数实时需求。通信流程图如下:

  • 服务端推送消息

    ad7019de13d937d1b4239fdb99b97e8b.png

    1.Js客户端点击发布按钮调用API接口;

    2.接口内部将信息交给SignalR处理;

    3.获取所有客户端,并通过远程调用客户端方法的方式将信息传递给客户端,最后信息就可以实时展示了。

  • 客户端上报数据

    cb0b4e7e6134fbdde9efa5ae63c4de2f.png

    1.在窗体客户端中点击按钮,内部调用服务端的UpdateDataServer方法;

    2.服务端被调用之后,内部获取所有客户端,并调用客户端中updatedata方法;最后在客户端将信息展示。

案例源码地址:https://gitee.com/CodeZoe/dot-net-core-study-demo/tree/main/SignalRDemo

总结

关于SignalR的简单使用先说这么多,便捷又好用;还有一些关键的知识点后续会分享,比如针对分组和用户发信息、添加认证管理等,关注“Code综艺圈”,和我一起学习吧;

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

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

相关文章

四位数码管树莓派c语言,用树莓派和四位数码管模块做一个时钟

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?预备知识如图,这是一个4位数码管模块,由两片 74HC595 级联控制,引脚如图,从上到下,分别为VCC(3.3V/5V),…

这5部不容错过的超高评价纪录片,带你领略地球的魅力!

全世界只有3.14 % 的人关注了爆炸吧知识地球是茫茫宇宙星系中唯一生机勃勃万物生存的星球,它是瞬息万变、充满自然奇观的世界。50多亿年来,地球在日复一日、沧海桑田地变化着。今天就给大家带来最顶尖的BBC地球科普纪录片,最盛大的听觉盛宴&a…

【转】Android 带checkbox的listView 实现多选,全选,反选 -- 不错

原文网址:http://blog.csdn.net/onlyonecoder/article/details/8687811 Demo地址(0分资源):http://download.csdn.net/detail/onlyonecoder/5154352 由于listview的一些特性,刚开始写这种需求的功能的时候都会碰到一些…

第三方QQ、微博登陆

一定要把token uid 这些参数搞明白是干什么的 第一种方法是转的 &#xff08;通过javascript来调用&#xff09; 最近接触了一些第三方登陆的东西&#xff0c;弄的真是一个头&#xff0c;两个大>.< 今天&#xff0c;终于把腾讯第三方登陆调试通了&#xff0c;做一…

由NTC电阻值 计算温度 C语言,高精度NTC测温电路设计及电阻值计算

什么是NTCNTC是热敏电阻&#xff0c;其电阻值对温度变化敏感&#xff0c;在不同的温度下&#xff0c;可以呈现不同的电阻值。热敏电阻有两类&#xff0c;一类是负温度系数电阻(NTC)&#xff0c;温度增加时&#xff0c;电阻值降低&#xff0c;另一类是正温度系数电阻(PTC)&#…

史上最被低估的两个学科!它们远比你想的更重要!

▲点击查看哈佛大学本杰明教授曾说&#xff1a;“越是到了高等教育的阶段&#xff0c;人们就越重视从历史中总结经验&#xff0c;尤其是精英阶层。很多人都想好好读读历史&#xff0c;但是一直以来&#xff0c;读历史都有一个问题&#xff1a;看着满满都是字的大部头&#xff0…

这是你想象中的泳池美女吗?爱了吗?

1 小手一插&#xff0c;谁都不爱▼2 玩滑板讲究顺其自然哪里摔倒&#xff0c;就在哪里跪下▼3 陪老婆待产的企鹅们▼4 这就是米其林三星级的地摊吗&#xff1f;▼5 年度最好的送男友礼物▼6 张雨绮表演内心戏全程▼7 说&#xff01;这种极品西瓜哪里有卖&#xff1f;▼你…

Abp Vnext Vue3 的版本实现

Abp Vnext Pro 的 Vue3 实现版本 开箱即用的中后台前端/设计解决方案开始Github地址文档地址演示地址系统功能[x] 用户管理[x] 角色管理[x] 审计日志[x] 后台任务[x] 集成事件[x] IdentityServer4[x] 客户端管理[x] Api 资源管理[x] ApiScope 管理[x] Identity 资源管理[x] Sin…

struts2配置中Action的name 和package的name和namespace作用

2019独角兽企业重金招聘Python工程师标准>>> struts2配置中Action的name 和package的name和namespace是什么作用 在struts2 struts.xml 配置中 <package name"ajax" extends"json-default" namespace"/json"> <action na…

【译】Tablix指南----通向报表服务的阶梯系列(四)

“Ah ha,发现你了&#xff01;”你的经理突然从桌子后面的假花旁冒出来&#xff0c;发出胜利的叫声。你沮丧地转过头看着经理。 “我已经创建了一个基本报表&#xff0c;并抓取了一些数据&#xff0c;我正打算-”你在他打断你之前快速的解释着。 “赶紧做完就好&#xff0c;大B…

熊吃人该不该杀?这头3米高的大熊吃了7个人,还在洞里藏了很多女人用的东西.........

全世界只有3.14 % 的人关注了爆炸吧知识10月18日&#xff0c;有网友爆料称“上海野生动物园猛兽区一饲养员遭群熊撕扯”。随后&#xff0c;上海野生动物园证实&#xff0c;该饲养员目前已身亡。据悉&#xff0c;他才27岁&#xff0c;还没成家。从网上发布的现场视频来看&#x…

还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb

在.NET世界中&#xff0c;提到ORM&#xff0c;最常用的是下面2个&#xff1a;Dapper&#xff0c;通过提供IDbConnection的扩展方法来查询数据库。它的优点在于可以轻松地执行参数化查询&#xff0c;将结果转化为对象&#xff1b;非常高效&#xff0c;在速度方面拥有micro-ORM之…

使用 PHP 7 给 Web 应用加速

PHP 20周年了&#xff01;&#xff1f;&#xff1f; PHP 首发通告&#xff0c;1995年6月8日 发布于 COMP.INFOSYSTEMS.WWW.AUTHORING.CGI 主题&#xff1a;正式宣布&#xff1a;个人主页工具&#xff08;Personal Home Page Tools&#xff09;正式宣布个人主页工具&#xff08;…

mvc教程

第一章 mvc概述 入门 需要安装 Visual Studio 2008 或 Visual Web Developer 2008 Express 来构建 ASP.NET MVC 应用程序。还需要下载 ASP.NET MVC Framework。 如果没有 Visual Studio 2008&#xff0c;可以从下面的网址下载 90 天试用版&#xff1a; http://msdn.microsoft.c…

windows下面怎么github ssh 公钥,然后克隆项目

windos下面怎么github ssh 公钥,然后克隆项目 第一步、 1. 安装git,从程序目录打开 "Git Bash" 2. 键入命令:ssh-keygen -t rsa -C "email@email.com" 我的邮箱是chen_yu@kuyu.com , "email@email.com"是github账号 3. 提醒你输入key的…

连破四次吉尼斯世界纪录!厨师界再出神人,用一公斤拉面缔造了一代传奇,背后却是简单的原理……

全世界只有3.14 % 的人关注了爆炸吧知识超模君最喜欢的就是公司楼下海底捞火锅面。不仅是面确实好吃&#xff0c;更重要的是因为海底捞拉面小哥的技艺十分精湛&#xff01;提臀、收腹&#xff0c;只见拉面小哥化身蹦迪达人&#xff0c;在旋转跳跃中舞动拉面。一顿猛如虎的操作之…

微软推出 .NET 官方社区论坛

James 近日发布博客&#xff08;https://devblogs.microsoft.com/dotnet/introducing-the-net-tech-community-forums/&#xff09;&#xff0c;推出 .NET 官方社区论坛&#xff0c;为开发者提供一个官方的交流平台&#xff0c;小道消息&#xff0c;微软即将上线中文版的.NET网…

android sdk中添加自定义api,android SDK中添加自定义api【转】

本文的思路&#xff1a;android APP调用自定义java API,自定义java API调用自定义jni接口1&#xff1a;在android源码目录framework/base下面创建add目录add目录里面的结构如下&#xff1a;里面的Nadd.java android_jnitest_Nadd.cpp 和Android.mk内容如下&#xff1a;Nadd.jav…

远程控制利器TeamViewer使用教程(图)

TeamViewer是什么&#xff1f; 他是一款免费的可以穿透内网的远程控制软件&#xff0c;可以实现桌面共享&#xff0c;文件传送等功能&#xff0c;简单一点说就是和QQ远程协助一样&#xff0c;但是比QQ的远程协助功能更为强大。 TeamViewer与木马有什么区别&#xff1f; 说到远程…

千万别让男朋友穿你的短裙......

1 工作太辛苦&#xff0c;我要走了...▼2 应该很有效&#xff1f;▼3 疑车有据&#xff01;&#xff01;▼4 这是一部色魔功法...▼5 穿上女友的衣服居然毫无违和感▼视频来源见水印&#xff0c;侵删6 整挺好&#xff01;▼7 这只有熊猫可以驾驭得了......▼你点的每个赞&…