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示例 ...
随机推荐
- SmartRoute之远程接口调用和负载
基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性.为了让SmartRoute更适合业务应用集成,在新的一年开始SmartRoute集成了远程接口 ...
- java初级开发程序员(第五单元)
1.循环结构(一): 语法: while(循环条件){ //循环操作 } 示列代码: int i=1; while(i<=100){ System.out.println(&qu ...
- eclipse下进行spark开发(已实践)
开发准备: jdk1.8.45 spark-2.0.0-bin-hadoop2.7(windows下和linux个留一份) Linux系统(centos或其它) spark安装环境 hadoop-2. ...
- 对本地Solr服务器添加IK中文分词器实现全文检索功能
在上一篇随笔中我们提到schema.xml中<field/>元素标签的配置,该标签中有四个属性,分别是name.type.indexed与stored,这篇随笔将讲述通过设置type属性的 ...
- 每天一个Linux命令(17)--whereis命令
whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返所有信息. 和find相比,whereis查找的速度非 ...
- Struts2之环境配置
在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...
- 05String字符串课后作业
1.请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 由此可得出,用加号连接的字符串和一整个字符串相同代码判断是true,而新开辟空间的不 ...
- Vue2.0音乐播放器
学习了几周的vuejs,学习的过程中做了一个音乐播放器WebApp (顺便听听音乐~) ,过程中也有借鉴过别人做的,感觉受益匪浅 链接 项目在线地址 : 音乐播放器 github : https:// ...
- 写lua时需要注意的地方
条件语句判断时,只有false和nil会导致判断为假,其他的任何值都为真. Lua 的字符串与编码无关: 它不关心字符串中具体内容. 标准 Lua 使用 64 位整数和双精度(64 位)浮点数, 但你 ...
- 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课
1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 383 Solved ...