B/S(Web)实时通讯解决方案分享
发布时间 - 2026-01-11 00:32:18 点击率:次B/S的实时通讯实现起来比较麻烦,因为http协议是无状态的,导致一些实时消息通知和聊天等功能比较难以实现,本文主要简述几种自己之前常用的几种方式。

1、传统的HTTP协议是无状态的
传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据,多个用户进行实时的交流也比较困难,比如聊天系统。
2、目前比较流量的实时通讯方式
轮询
条件:任何Web端
客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
长轮询
条件:任何Web端
客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
Flash socket
条件:需要安装Flash插件
在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
Web Socket
条件:支持H5 Web socket
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duple)。一开始的握手需要借助HTTP请求完成。
3、B/S 实时通讯轮询方式
3.1传统轮询
客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
缺点:耗费资源,耗费流量 。根据用户窗口数量,请求次数成倍的增加。
3.2 传统长轮询
客户端向服务器发送Ajax请求,服务器接到请求后hold住链接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
由于浏览器同时只能有一定数量的链接同时hold,所有这种方式如果窗口打开多个,就会导致后面打开的窗口一直等待前面hold的链接。
3.3传统长轮询+ActiveMq
ActiveMq的方式相比传统的查询数据库有一定的优势,这样减少了多次查询数据库的问题,效率也会有所提升。但是这种方式每个用户的每个窗口都会有个订阅和链接,这样导致ActiveMq服务器的链接数会随着用户的增加而增加,最后导致链接数沾满。
4、ASP.NETSignalR
很明显轮询的方式并不是最好的解决方式,当然web socket是一种很好的实现方式,但是编程起来比较麻烦,由于lz是做.net开发,所以选择了ASP.NET SignalR。而且SignalR会兼容各种浏览器,如果浏览器支持web socket,则用web socket方式,如果不支持则用长轮询的方式实现。
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。即你有信息了再来通知我,而不是我傻乎乎的每次跑来问你。
http://signalr.net/
4.1 SignalR 简单编程
SignalR的配置以及应用详情可以参数官方文档,这里只做简单的发送消息和接收消息的示例。
1、客户端发送消息至服务端
2、服务端发送消息至客户端
在服务端向客户端发送消息时可以选择三种发送方式
1、All:所有页面,比如:实时股票信息。
Clients.All.xx();
2、Client:单个页面,比如:聊天系统。
Clients.Client("connectionId").xx();
3、Group:组,比如:同一个用户所有页面收到通知。
Clients.Group("groupName").xx();
更多关于SignalR的详情介绍,和实现群聊功能,可以参考另一篇 应用并实现群聊功能 开源代码
4.2 SignalR+数据库
这种方式解决了用户多个窗口不能收到消息的问题,而且数据库的刷新频率只会有一个线程刷新,并不会随着用户的增加而增加,从而大大的减小了数据库的刷新频率。
4.3SignalR+ActiveMq(最终解决方式)
这种方式既解决了链接数的问题,也同时解决了用户多个窗口不能收到消息的问题,而且用了ActiveMq也不用去实时刷新数据库。
结语
以上是lz在开发中应用的多种B/S实时通信的解决方案,望对各位有所帮助,本文原创,欢迎拍砖和推荐。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# B/S
# 实时通讯
# 关于B/S判断浏览器断开的问题讨论
# 在B/S开发中经常用到的JavaScript技术
# b/s开发常用javaScript技术
# .net的socket异步通讯示例分享
# 客户端
# 多个
# 服务端
# 发送消息
# 有一定
# 几种
# 解决了
# 开发人员
# 再向
# 则用
# 而不是
# 新消息
# 就会
# 很好
# 是一种
# 也会
# 有个
# 最好的
# 很难
# 是指
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Docker环境搭建教程_Laravel Sail使用指南
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel如何发送系统通知?(Notification渠道示例)
Linux网络带宽限制_tc配置实践解析【教程】
如何确认建站备案号应放置的具体位置?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel如何实现API版本控制_Laravel版本化API设计方案
如何实现javascript表单验证_正则表达式有哪些实用技巧
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
javascript基本数据类型及类型检测常用方法小结
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Laravel如何处理CORS跨域请求?(配置示例)
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何在服务器上配置二级域名建站?
中国移动官方网站首页入口 中国移动官网网页登录
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
微信小程序 require机制详解及实例代码
EditPlus中的正则表达式实战(6)
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
免费视频制作网站,更新又快又好的免费电影网站?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何在Ubuntu系统下快速搭建WordPress个人网站?
详解CentOS6.5 安装 MySQL5.1.71的方法
Laravel如何配置任务调度?(Cron Job示例)
网站制作免费,什么网站能看正片电影?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
青岛网站建设如何选择本地服务器?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel模型事件有哪些_Laravel Model Event生命周期详解
Laravel如何处理和验证JSON类型的数据库字段
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel如何实现数据库事务?(DB Facade示例)
北京企业网站设计制作公司,北京铁路集团官方网站?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
详解Android——蓝牙技术 带你实现终端间数据传输
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何快速生成可下载的建站源码工具?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
佛山企业网站制作公司有哪些,沟通100网上服务官网?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭

