websocket学习
//理论部分转载自:https://www.jianshu.com/p/95d259b05c67
谈到Web实时推送,就不得不说WebSocket。谈到Web实时推送,就不得不说WebSocket。Comet又可细分为两种实现方式,一种是长轮询机制,一种称为流技术,这两种方式实际上是对轮询技术的改进,这些方案带来很明显的缺点,需要由浏览器对服务器发出HTTP request,,大量消耗服务器带宽和资源。
面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并实现真正意义上的实时推送。
1. wbesocket是什么?
WebSocket是HTML5出的东西(协议)
可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。WebSocket不是HTTP协议,HTTP只负责建立WebSocket连接。
- WebSocket协议本质上是一个基于TCP的 独立的协议,能够在浏览器和服务器之间建立双向连接,以基于事件的方式,赋予浏览器实时通信能力。
- 协议名为"ws",这意味着一个websocket连接地址会是这样的写法:ws://**。websocket协议本质上是一个基于tcp的协议
- 是服务器实现的。客户端通过html5与服务器交互。http是不持续连接的,而websocket是。必须服务器支持websocket协议,才有效。对于不支持websocket服务的服务器,你客户端怎么写代码都没用。
WebSocket实战:
Web领域的实时推送技术,这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新。它有着广泛的应用场景,比如双人对战小游戏、在线聊天室、在线客服系统、评论系统、WebIM等。
2.websocket解决了什么问题?
在了解这个之前我先来科普一下:
了解背景: 在以前 HTTP 协议中所谓的 **keep-alive connection** 是: 指在一次 TCP 连接中完成多个 HTTP 请求,但是对每个请求仍然要单独发 header; 所谓的 polling : 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求查询是否有新数据 。 这两种模式有一个共同的缺点: 就是除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,信息交换效率很低。 它们建立的“长连接”都是伪.长连接. 只不过好处是不需要对现有的 HTTP server 和浏览器架构做修改就能实现。
http long poll,或者ajax轮询都可以实现实时信息传递
ajax轮询
原理:让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
- 客户端(发请求,建立链接):啦啦啦,有没有新信息(Request)
- 服务端:没有(Response)
- 客户端(发请求,建立链接):啦啦啦,有没有新信息(Request)
- 服务端:没有。。(Response)
- 客户端(发请求,建立链接):啦啦啦,有没有新信息(Request)
- 服务端:你好烦啊,没有啊。。(Response)
- 客户端(发请求,建立链接):啦啦啦,有没有新消息(Request)
- 服务端:好啦好啦,有啦给你。(Response)
- 客户端(发请求,建立链接):啦啦啦,有没有新消息(Request)
http long poll:
- 客户端(发请求,建立链接):啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
- 等等等。。。。。
- 服务端:额。。 等待到有消息的时候。。来 给你(Response)
- 客户端(发请求,建立链接):啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop
从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性(服务端不能主动联系客户端,只能有客户端发起。)。
由此可以看出上面那种方式的缺陷:
非常消耗资源的:
ajax轮询 需要服务器有很快的处理速度和资源。(速度)
long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)
所以在这种情况下出现了,Websocket出现了。
它解决了HTTP的这几个难题:
非持久性
同步有延迟
消耗资源
无状态协议。
被动性
原文地址:https://www.cnblogs.com/lfri/p/11871400.html
- 一个简单的案例带你入门Dubbo分布式框架
- Ajax上传图片以及上传之前先预览
- Spring Cloud中Hystrix的服务降级与异常处理
- Open vSwitch源码解析之基于VxLAN实现NSH解析功能
- Spring Cloud自定义Hystrix请求命令
- JavaScript面试问题:事件委托和this
- Spring Cloud中的断路器Hystrix
- js的隐含参数(arguments,callee,caller)使用方法
- Spring Cloud中的负载均衡策略
- Spring Cloud中负载均衡器概览
- 没有event loop的PHP
- RestTemplate的逆袭之路,从发送请求到负载均衡
- limit_area_cirle
- Spring RestTemplate中几种常见的请求方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用OpenCV自动去除背景色
- Redis入坟(四)Redis内存回收知多少
- Redis入坟(五)持久化
- Python爬取杜赛博客教程内容,应用pdfkit打印pdf文件
- Java程序员必须知道的常用序列化技术及选型,Protobuf 原理详解
- Python异步编程之 协程 & asyncio & 异步
- Redis入坟(八)内存管理与优化,面试必考
- 逐行阅读Spring5.X源码(十二)AOP源码分析,难!面试官都不一定懂!
- 逐行阅读Spring5.X源码(十三)spring事务源码分析
- 线程池ThreadPoolExecutor 源码分析,面试官也就那么回事,他怎么敢!
- Spug - 轻量级自动化运维平台
- Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
- 优雅的drop掉mysql库中1TB大表
- 《剑指offer》第19天:股票交易(校对)
- SwiftyUserDefaults-封装系统本地化的框架推荐