浏览器及时感知服务端数据变化的方式
需求
在公司,有一个需求,是浏览器实时获取服务端数据变化,然后根据变化做相应的动作。需求场景如下:手机端扫描二维码,然后获取待取件订单列表,点击取件,进行取件,同时远端打印机打印出取件小票。
技术难点
- 手机端点击取货,浏览器如何感知到,如何做相应的操作(本文要解决的问题)
- 浏览器感知后,如何调用打印服务,进行按照相应的模版打印
技术方案及选型
不断轮询(pull的方式)
所谓不断轮询,就是浏览器保持发送请求,检查服务器是否有新信息返回,服务器对于每次请求均应立即响应。这种方式需要设定合理的时间间隔。例如:邮件客户端可以每隔几分钟检查服务器是否有新邮件。
优点
简单,可靠
局限性
效率不高。如果需要及时获得服务器信息,那么轮询频率就必须非常高,导致服务端压力较大。更适合小型应用。
长轮询(pull的方式)
浏览器发送请求,但是服务器不予以响应,一直到服务器有了新信息才响应客户端。从客户端的角度看它和传统的轮询相同。但从服务器端的角度来看它与传统的轮询相比,减少了服务器端的开销。
例子:网页版聊天工具如webqq(摘抄):
1.用户在网页上发送聊天信息时,网页会给服务器发送请求,服务器将聊天数据存储下来;
2.网页也会向服务器请求对方发送的聊天信息;
3.服务器收到这种请求后,会通过“死循环”等方式阻塞该请求,从而在一定程度上控制住这个连接。“死循环“退出的条件有两种:一是有数据需要响应,此时便立即发送该响应;二是超时,等了很久还是没有数据,服务器不能让客户端无限地等待下去,所以会在超时时间点给客户端发送空的响应;
4.网页处理完响应后再向服务器发送新一轮的请求。
优点
相比不断轮询,性能有了很大提升。
缺点
依然有空的响应。
长连接(push的方式)
通过websocket协议使浏览器和服务器建立一个通道,当服务器有信息变化时,就主动推送一次。
优点
真正实时。
局限性
由于websocket是html5的新特性,浏览器对h5的支持有限,目前chrome,firefox,IE10以上支持。
常见应用场景
扫码登录网页版微信。12306支付时,扫支付宝,会自动回填浏览器用户信息等。
选型
技术选型,并不是技术越高级,越高大上越好,而是看我们的技术,能不能在最短的时间内完成,以最低的成本来支撑业务的正常推进。所以,以上三种方法,根据自己系统的情况来选择,并不能定论哪个方法好,哪个方法不好。
相关文章:

拥抱Node.js 8.0,N-API入门极简例子
本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。欢迎加群交流,群号 197339705。 N-API简介 Node.js 8.0 在2017年6月份发布,升级的特性中,包含了N-API。编写过或者使用过 node扩展的同学&#x…
什么是标记符控制的分水岭算法
本文首先指出传统分水岭算法的不足,然后介绍了标记符控制的分水岭算法,最后通过实例演示了该算法在图像分割中的应用。该微信图文由安晟提供。

.NE 后退刷新验证码
Response.Buffer true; Response.Expires -1; Response.ExpiresAbsolute DateTime.Now.AddDays(-1); Response.Expires0; Response.CacheControl "no-cache"; 转载于:https://www.cnblogs.com/lmjob/archive/2008/09/01/128096…
intellij打开工程在每个java文件上有个红色的无效符的解决办法
说明该类不是可编译文件。在project Structure中(快捷键ctrlaltshifts)选Modules将你带红圈的文件添加上,将你带红圈的文件夹设为Sources。一般是src文件夹,点Sources文件夹,然后点击OK。设置为可编译文件再去工程中看…

[zt] petshop4.0 详解之三
三、PetShop数据访问层之消息处理在进行系统设计时,除了对安全、事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量、数据流量、服务器负荷的问题。解决性能的瓶颈&a…

windows下Bullet 2.82编译安装(Bullet Physics开发环境配置)
平台:Win7,VS2010 1. Bullet库的组织 下图是Bullet_User_Manual中的截图: 从中可见,Bullet的LinearMath(线性数学模块),其上是BulletCollision(碰撞检测模块),…
Matlab与线性代数 -- 寻找矩阵的非零元素
本微信图文详细介绍了Matlab中find函数的用法。

java重新回顾
很不幸,自己的移动硬盘坏掉了,之前自己所做的学习笔记都没了,大概有300多篇,是大学学习java的时候整理复习的,这样的损失是巨大的,这将花费我更多的时间重新去整理,但是事实已经是这样的了。 基…

BestCoder 1st Anniversary ($) 1002.Hidden String
Hidden String Accepts: 437 Submissions: 2174 Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others)问题描写叙述今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为n的字符串s. 他想要知道是否能找到s的三个互不相交的子串s[l1..r1],…

动态生成GridView时,加入DataKeyNames属性,回调时出错解决方法
早上看到有位同学问关于自动生成GridVie并且添加DataKeyNames属性后 回调页面时,出现错误异常.下面是我实现的方法。注意一点。就是数据绑定的时间。 要是先绑定,再添加到div1中,回调页面时,就会出错。 页面代码: <…
如何制作风格迁移图?
本微信图文介绍了实现风格迁移图的基本原理并在此基础上制作了效果展示图。

leetcode--链表的设计--python
leetcode--链表的设计--python题目题目详情示例提示解题代码代码运行结果体会题目 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向…

从空间数据库中删除所有拓扑对象
/// <summary> /// //从空间数据库中删除所有拓扑对象 /// </summary> /// <returns></returns> public bool DeleteALLTopolgyFromGISDB() { bool rbc true; try { …
Altium Desgner软件,PCB设计中铺铜的作用
PS原文出自http://mp.weixin.qq.com/s/5mLNXzCDm1hGOXiKNE8Ddg 问1:为何要铺铜? 答:一般铺铜有几个方面原因。 1、EMC.对于大面积的地或电源铺铜,会起到屏蔽作用,有些特殊地,如PGND起到防护作用。ÿ…
如何利用自组织竞争网络进行患者癌症发病预测
如何利用自组织竞争网络进行患者癌症发病预测 数据下载: http://download.csdn.net/detail/lsgo_myp/9711473

leetcode--反转链表--python
文章目录题目题目详情示例提示解题代码代码运行结果体会题目 题目详情 反转一个单链表。 示例 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL提示 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 解题代码 …

非递归一次性加载分类数据到TreeViw
不是经常用,发现再次用到时又要再写一遍,这次花点时间记录一下 代码:------------------------------------- private void InitView() { DataView dv CommodityClassBLL.Query().Tables[0].DefaultView; if (dv.Count > 1) { dv.Sort …
什么是SESSION?(二)
本篇图文讨论了SESSION多服务器共享问题以及SESSION操作的效率问题。本篇微信图文由钟锦提供。

leetcode--两数之和--python
文章目录题目题目详情示例解题代码代码运行结果体会题目 题目详情 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复…

关于 OpenIdConnect 认证启用 HTTPS 回调 RedirectUri 不生效问题
在搭建 IdentityServer 服务端后,我们尝试使用了 OIDC(OpenID Connect) 的中间件来代替了原先的 Session 系统认证方式,起初采用的是 HTTP 协议,一切都没有什么问题,最近启用全站 HTTPS 后,发现登陆会跳转到 HTTP的页面…

C#中使用GUID
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成GUID的API。生成算法很有意思,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。GUID的唯一缺陷在于生…
Matlab与线性代数 -- 对角矩阵
本微信图文详细介绍了Matlab中diag()函数的应用。

leetcode--对称二叉树--python
文章目录题目题目详情示例说明解题代码代码运行结果体会题目 题目详情 给定一个二叉树,检查它是否是镜像对称的。 示例 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1…

IPV6的设置问题!
最近一段在研究IPV6,在网上搜了好多资料,但是感觉大部分都不实在,都是泛泛而谈,实用性不强,故决定做点什么!正所谓该出手时就出手,风风火火闯九州哦~~ IPV6设置步骤: 1.首先查看你时…
Matlab与线性代数 -- 数组与矩阵的乘幂
本微信图文详细介绍了数组的乘幂运算power()与矩阵的乘幂运算mpower()。

Docker 公司是如何做社区的?
今天看了一个Docker公司是如何做社区的PPT,演讲者是Docker公司的市场部老大。Docker从发布之初就受到了开发者的关注,1.0版本发布的时候Docker就收到了超过460位贡献者的8741条改进建议,Docker也承认是社区帮助他们迅速达到了这一新的里程碑。…

leetcode--整数反转--python
文章目录题目题目详情示例注意解题代码小知识代码运行结果体会题目 题目详情 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 输入: 123 输出: 321输入: -123 输出: -321输入: 120 输出: 21注意 假设我们的环境只能存储得下 32 位…

水晶报表调用存储过程的问题
前言:现在碰到了水晶报表调用存储过程的问题,问题是这样的:ERP软件里有很多的数据表,有些报表的字段要从多个数据表里取数据,并且要对数据进行处理,来作为报表的字段,我看了些资料,说…

iOS-ARC_Xcode检测循环引用
iOS-ARC_Xcode检测循环引用 一,在桌面上新建立一个工程,在ViewController.m中输入如下代码: - (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.NSMutableArray *firstArr…
什么是SESSION?(三)
本微信图文通过一个利用数据库的方式存储Session的例子,深入介绍了对Session机制的理解。本微信图文由钟锦提供。