提出问题:A  =>  服务器  =>  B           B端浏览器如何知道服务器有A发来的数据?

解决方案:

第1种:频繁轮询    间隔1秒B向服务器讨要数据,就算数据为空。【浪费服务器大量响应请求资源】

第2种:长轮询    服务器要发数据时才发,如果在服务器响应前,浏览器有新数据只能走并行请求(或者终止当前请求。)

    这里有个限制,一般来说规范【超时时间是60秒】。

    还有个限制,HTTP1.1版本浏览器只能发起两个连接到同一个主机名。(一般1个连接请求,另1个连接负责抓取图片资源。)

第3种:分块编码  用Transfer-Encoding:chunked代替Content-Length:lenN 【解决长轮询超时限制(大文件下载分块)但不能解决浏览器只能创建两个连接】

  初始化 创建一个接收服务器发送的事件监听,后续每个块都是事件触发XMLHttpRequest对象的onreadystatechange事件处理器调用。(连接需要刷新)

第4种:Applet 、Flash  在浏览器和服务器之间【单个连接模拟全双工通信】,本质创建了TCP插头,绕过HTTP协议超时和并发连接限制,以及Ajax安全限制必须要同一个完全限定域名。

  插件本身没有安全协议,缓慢占内存...随着移动互联网,渐渐被取代。

【WebSocket协议】原生的TCP插头。80(ws)  443(wss) ,几乎所有防火墙都不阻塞WebSocket连接。

【Http1.1版本升级特性的利用】最早在请求中包含Connection:Upgrade,常被用来从HTTP升级到HTTPS,容易收到中间人攻击所以被HTTPS URI替代。

【使用HTTP升级特性】在升级握手完成之后,不再使用HTTP连接,这时候可以使用持久的、全双工TCP插头连接。

【浏览器厂商规范】协议:ws[s]   头部:Connection:Upgrade Upgrade:websocket

    其实HTTP请求不含 ws[s]。只是告诉浏览器要不要SSL/TLS加密。

【初始化】A => 服务器        服务区 => A  101交换协议

【初始化后心跳消息】ping pong

请求

GET /webSocketEndpoint HTTP/1.1

Host:www.example.org

Connection:Upgrade

Origin:http://example.com

Sec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhxDw==   //base64编码  浏览器生成

Sec-WebSocket-Version:13

Sec-WebSocket-Protocol:game   //聊天、游戏、股票

响应

HTTP/1.1 101 状态码描述

Server:Apache 2.4

Connection:Upgrade

Upgrade:webSocket

Sec-WebSocket-Accept:x3JJHMbDL1EzLkh9GBhxDw==   //base64编码  浏览器生成

Sec-WebSocket-Protocol:game   //聊天、游戏、股票

TCP插头接入,websocket连接开始,最大的障碍是HTTP代理,最可靠的方式是是用HTTPS版本wss。

【演变】Ajax(AjAj)到WebSocket的更多相关文章

  1. 反向Ajax,第2部分:WebSocket

    转自:http://kb.cnblogs.com/page/112616/ 前言 时至今日,用户期待的是可通过web访问快速.动态的应用.这一文章系列展示了如何使用反向Ajax(Reverse Aja ...

  2. 反向Ajax:WebSocket

    郭晨 软件151 1531610114 WebSocket 在HTML5中出现的WebSocket是一种比Comet还要新的反向Ajax技术,WebSocket启用了双向的全双工通信信道,许多浏览器( ...

  3. HTML5中的webSocket、ajax、http

    本文原链接:https://cloud.tencent.com/developer/article/1115496 https://cloud.tencent.com/developer/articl ...

  4. 反向ajax实现

    在过去的几年中,web开发已经发生了很大的变化.现如今,我们期望的是能够通过web快速.动态地访问应用.在这一新的文章系列中,我们学习如何使用反 向Ajax(Reverse Ajax)技术来开发事件驱 ...

  5. 【理论面试篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题

    ##2017.10.30收集 面试技巧 5.1 面试形式 1)        一般而言,小公司做笔试题:大公司面谈项目经验:做地图的一定考算法 2)        面试官喜欢什么样的人 ü  技术好. ...

  6. JavaScript异步编程原理

    众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...

  7. 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)

    了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发) Guillermo Rauch 编   赵静 译 ISBN 978-7-121-21769-2 2 ...

  8. WeX5和BeX5比较

    http://wex5.com/cn/wex5和bex5比较/ WeX5和BeX5比较 许多对WeX5和BeX5略有了解得人都知道,WeX5和BeX5是完全共用前端框架技术的.但是WeX5和BeX5是 ...

  9. WEB实时聊天 comet推技术

    转自:http://www.cnblogs.com/wodemeng/archive/2012/04/06/2435302.html 今天晚上朋友遇到web服务端推技术的问题,自己就查了下资料,学习了 ...

  10. 用做网页开发经历了三个阶段(附长篇讨论) good

    用做网页开发经历了三个阶段:第一阶:傻干阶段使用Intraweb,傻瓜型,无需知道javascript,html,css,会pascal就可以了. 第二阶:困惑阶段使用Intraweb,有很多限制,比 ...

随机推荐

  1. Chinese Mahjong UVA - 11210 (DFS)

    先记录下每一种麻将出现的次数,然后枚举每一种可能得到的麻将,对于这个新的麻将牌,去判断可不可能胡,如果可以胡,就可以把这张牌输出出来. 因为eye只能有一张,所以这个是最好枚举的,就枚举每张牌成为ey ...

  2. LOJ#6283. 数列分块入门 7

    对于每个区间先乘在加,如果我修改的是部分的块,我就需要把现这个块的add和mul标记全部放下去,然后再更新. #include<map> #include<set> #incl ...

  3. luogu P4299 首都

    题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...

  4. 【算法】php计算数字k在一段数字范围出现的次数

    计算数字k在0到n中的出现的次数,k可能是[0~9]内的一个值. 例如数字n=25,k=1,在1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  5. Can DBC文件翻译

    1 引言 DBC文件描述单个CAN网络的通信.这个信息足以监测和分析网络并模拟不是物理可用的节点(剩余的总线模拟). DBC文件也可以用来开发电子控制单元的通信软件,该控制单元应该是CAN网络的一部分 ...

  6. String:字符串常量池

    String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...

  7. HDU3032 Nim or not Nim?

    解:使用sg函数打表发现规律,然后暴力异或起来即可. #include <bits/stdc++.h> typedef long long LL; ; int a[N]; inline L ...

  8. java web session过期 跳转页面没有跳出frame的问题

    对于frame页面框架的java web项目,如果session过期执行跳转操作时,只在一个frame中(例如center frame)跳转到设置的login页面了,为了能直接跳转到最初的登录页面,就 ...

  9. Mock2 moco框架的http协议get方法Mock的实现

    首先在Chapter7文件夹下再新建一个startGet.json startget.json代码如下,因为是get请求,所以要写method关键字,有两个,一个是有参数,一个是无参数的请求. [ { ...

  10. IDEA或Webstorm设置Ctrl+滚轮调整字体大小

    按Ctrl+Shift+A,出现搜索框 输入mouse: 点击打开这个设置:勾选 点击ok,之后就可以通过Ctrl+滚轮 调整字体大小了.