B/S(Web)实时通讯解决方案分享


Posted in Javascript onApril 06, 2017

B/S的实时通讯实现起来比较麻烦,因为http协议是无状态的,导致一些实时消息通知和聊天等功能比较难以实现,本文主要简述几种自己之前常用的几种方式。

1、传统的HTTP协议是无状态的

传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据,多个用户进行实时的交流也比较困难,比如聊天系统。

B/S(Web)实时通讯解决方案分享

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请求,服务器接到请求后马上返回响应信息并关闭连接。

缺点:耗费资源,耗费流量 。根据用户窗口数量,请求次数成倍的增加。

B/S(Web)实时通讯解决方案分享

3.2 传统长轮询

客户端向服务器发送Ajax请求,服务器接到请求后hold住链接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

由于浏览器同时只能有一定数量的链接同时hold,所有这种方式如果窗口打开多个,就会导致后面打开的窗口一直等待前面hold的链接。

B/S(Web)实时通讯解决方案分享

3.3传统长轮询+ActiveMq

ActiveMq的方式相比传统的查询数据库有一定的优势,这样减少了多次查询数据库的问题,效率也会有所提升。但是这种方式每个用户的每个窗口都会有个订阅和链接,这样导致ActiveMq服务器的链接数会随着用户的增加而增加,最后导致链接数沾满。

B/S(Web)实时通讯解决方案分享

4、ASP.NETSignalR

很明显轮询的方式并不是最好的解决方式,当然web socket是一种很好的实现方式,但是编程起来比较麻烦,由于lz是做.net开发,所以选择了ASP.NET SignalR。而且SignalR会兼容各种浏览器,如果浏览器支持web socket,则用web socket方式,如果不支持则用长轮询的方式实现。

ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。即你有信息了再来通知我,而不是我傻乎乎的每次跑来问你。

4.2 SignalR+数据库

这种方式解决了用户多个窗口不能收到消息的问题,而且数据库的刷新频率只会有一个线程刷新,并不会随着用户的增加而增加,从而大大的减小了数据库的刷新频率。

B/S(Web)实时通讯解决方案分享

4.3SignalR+ActiveMq(最终解决方式)

这种方式既解决了链接数的问题,也同时解决了用户多个窗口不能收到消息的问题,而且用了ActiveMq也不用去实时刷新数据库。

B/S(Web)实时通讯解决方案分享

结语

以上是lz在开发中应用的多种B/S实时通信的解决方案,望对各位有所帮助,本文原创,欢迎拍砖和推荐。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于IFRAME 自适应高度的研究
Jul 20 Javascript
location.search在客户端获取Url参数的方法
Jun 08 Javascript
jWiard 基于JQuery的强大的向导控件介绍
Oct 28 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
js使用setTimeout实现定时炸弹的方法
Apr 10 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
Apr 28 Javascript
jQuery改变form表单的action,并进行提交的实现代码
May 25 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
9种改善AngularJS性能的方法
Nov 28 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
Oct 09 jQuery
JavaScript实现网页下拉菜单效果
Nov 20 Javascript
HTML中使背景图片自适应浏览器大小实例详解
Apr 06 #Javascript
ES6中的箭头函数实例详解
Apr 06 #Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 #Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 #Javascript
javascript中this用法实例详解
Apr 06 #Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
Apr 06 #Javascript
js遍历获取表格内数据的方法(必看)
Apr 06 #Javascript
You might like
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
destoon各类调用汇总
2014/06/20 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
详解Vue依赖收集引发的问题
2019/04/22 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
django数据库migrate失败的解决方法解析
2018/02/08 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
Python读取实时数据流示例
2019/12/02 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
个人党性剖析材料
2014/02/03 职场文书
党支部评议意见
2015/06/02 职场文书
世界名著读书笔记
2015/06/25 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
把77A收信机改造成收音机
2022/04/05 无线电
Python 统计序列中元素的出现频度
2022/04/26 Python