B/S(Web)实时通讯解决方案
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.NET SignalR
很明显轮询的方式并不是最好的解决方式,当然web socket是一种很好的实现方式,但是编程起来比较麻烦,由于lz是做.net开发,所以选择了ASP.NET SignalR。而且SignalR会兼容各种浏览器,如果浏览器支持web socket,则用web socket方式,如果不支持则用长轮询的方式实现。
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。即你有信息了再来通知我,而不是我傻乎乎的每次跑来问你。

4.1 SignalR 简单编程
SignalR的配置以及应用详情可以参数官方文档,这里只做简单的发送消息和接收消息的示例。
1、客户端发送消息至服务端

2、服务端发送消息至客户端

在服务端向客户端发送消息时可以选择三种发送方式
1、All:所有页面,比如:实时股票信息。
Clients.All.xx();
2、Client:单个页面,比如:聊天系统。
Clients.Client("connectionId").xx();
3、Group:组,比如:同一个用户所有页面收到通知。
Clients.Group("groupName").xx();
4.2 SignalR+数据库
这种方式解决了用户多个窗口不能收到消息的问题,而且数据库的刷新频率只会有一个线程刷新,并不会随着用户的增加而增加,从而大大的减小了数据库的刷新频率。

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

结语
以上是lz在开发中应用的多种B/S实时通信的解决方案,望对各位有所帮助,本文原创,欢迎拍砖和推荐。
B/S(Web)实时通讯解决方案的更多相关文章
- Java开发之使用websocket实现web客户端与服务器之间的实时通讯
使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 <%@ page language="java" contentType=& ...
- [渣译文] SignalR 2.0 系列:SignalR的高频实时通讯
原文:[渣译文] SignalR 2.0 系列:SignalR的高频实时通讯 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...
- 常见的Web实时消息交互方式和SignalR
标签: WebSocket SignalR 前言 1. Web消息交互技术 1.1 常见技术 1.2 WebSocket介绍 1.3 WebSocket示例 2. Signal 2.1 SignalR ...
- 宣布发布 Windows Azure 导入/导出服务的预览版以及 Web 和移动解决方案场景的若干增强功能
客户评估基于云的存储解决方案时,面临的挑战之一是以经济高效.安全快速的方式从 Blob 存储区移进和移出大量数据.今天,我们很高兴地宣布发布 Windows Azure 导入/导出的预览版,这款新服务 ...
- 实时通讯系列目录篇之SignalR详解
一. 简单说几句 最早使用SignalR的时候大约是两年前了,记得当时是一个OA中消息的实时提醒,轮询的方式有点耗资源,WebSocket写起来又比较麻烦,最终选择了SignalR,当时是什么版本已经 ...
- WEB 实时推送技术的总结
前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控.Web 在线通讯.即时报价系统.在线游戏等,都需要将后台发生的变化主动地.实时地传送到浏览器端,而不需要用 ...
- WebSocke实时通讯协议
WebSocket 是什么? WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 ...
- 前端实现实时通讯-----ajax长连接
因为web运行模式为请求-响应,服务端无法主动发起通讯,所以通讯实时性存在各种问题,ajax轮询可以模拟及时通讯,但连接太频繁将给服务端带来很大压力,不频繁则实时性很差. 下面介绍在web上真正实现实 ...
- 【转】常见的Web实时消息交互方式和SignalR
https://www.cnblogs.com/Wddpct/p/5650015.html 前言 1. Web消息交互技术1.1 常见技术1.2 WebSocket介绍1.3 WebSocket示例 ...
随机推荐
- Git学习之路(5)- 同步到远程仓库及多人协作问题
▓▓▓▓▓▓ 大致介绍 我们写好文件后添加到版本库,但是这样还没有做完,我们还需要将它同步到GitHub的远程仓库上,这里就以我们刚开始的drag项目为例,我们在Git学习之路(2)-安装GIt和创建 ...
- 【Zookeeper】源码分析之请求处理链(一)
一.前言 前面已经分析了Watcher机制的主要代码,现在接着分析Zookeeper中的请求处理链,其是Zookeeper的主要特点之一. 二.总体框图 对于请求处理链而言,所有请求处理器的父接口为R ...
- 微信公众号平台接口开发:基础支持,获取微信服务器IP地址
官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 public static string Serve ...
- Mybatis实战之自定义TypeHandler处理枚举
在Mybatis中,处理枚举类的TypeHandler有两个: EnumTypeHandler: 用于保存枚举名 EnumOrdinalTypeHandler: 用于保存枚举的序号. 在实际项目中,以 ...
- JS批量替换内容中关键词为超链接,避开已存在的链接和alt、title中的关键词
懂点seo的人都知道要给内容中关键词加上链接,形成站内锚文本链接,这对seo有很大的帮助. 思路就是在数据库中录入若干个关键词和关键词对应的链接,当然链接可以根据关键词的id自动生成,或者直接用关键词 ...
- [Kafka] - Kafka基本概念介绍
Kafka官方介绍:Kafka是一个分布式的流处理平台(0.10.x版本),在kafka0.8.x版本的时候,kafka主要是作为一个分布式的.可分区的.具有副本数的日志服务系统(Kafka™ is ...
- [Hadoop] - Hadoop Mapreduce Error: GC overhead limit exceeded
在运行mapreduce的时候,出现Error: GC overhead limit exceeded,查看log日志,发现异常信息为 2015-12-11 11:48:44,716 FATAL [m ...
- CSS中padding和margin以及用法
CSS中padding与margin 1.padding:内边距,表示控件内容相对于边缘的距离. 2.margin:外边距,表示控件边缘相对于父空间的边缘. 参考:http://www.studyof ...
- 【2017-03-05】函数基础、函数四种结构、ref和out参数、递归
一.函数基础 1.函数/方法:非常抽象独立完成某项功能的一个个体 2.函数的作用: 提高代码的重用性提高功能开发的效率提高程序代码的可维护性 3.分类 固定功能函数高度抽象函数 4.函数四要素:输入, ...
- NSTimer定时器进阶——详细介绍,循环引用分析与解决
引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...