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 相关文章推荐
js 变量类型转换常用函数与代码[比较全]
Dec 01 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
JavaScript将数据转换成整数的方法
Jan 04 Javascript
最短的IE判断var ie=!-[1,]分析
May 28 Javascript
jQuery实现鼠标点击弹出渐变层的方法
Jul 09 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
Dec 13 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
Mar 25 Javascript
JavaScript中对象的不同创建方法
Aug 12 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
Oct 20 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
Feb 05 Javascript
详解JS异步加载的三种方式
Mar 07 Javascript
JavaScript数组去重算法实例小结
May 07 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用正则表达式匹配URL的简单方法
2013/11/12 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
Python中生成ndarray实例讲解
2021/02/22 Python
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
自我评价范文分享
2014/01/04 职场文书
公司业务员岗位职责
2014/03/18 职场文书
先进事迹材料范文
2014/12/29 职场文书
小学新教师个人总结
2015/02/05 职场文书
2015员工年度考核评语
2015/03/25 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers