websocket简介
在我们做web项目的过程中,经常需要做的一个模块是消息模块。典型的场景:一个商城系统的后台管理,我想实现如果前台有客户下单,后台就会接到消息,以便尽快发货处理。
要实现上述的功能,我们有几种备选的方案。
方案1.使用ajax短轮询,比如每隔1分钟去请求一次服务器,让服务器去数据库去查询,看看有无新的未处理的订单,然后返回给客户端。
方案2.长轮询,长轮询的原理与上述类似,只不过采取了阻塞响应(response)的方法,也就是说只要服务器没有响应,这个请求就不断开,一直等到服务器有响应为止。
ajax短轮询好比客户端每隔一段时间打一个电话给服务器,服务器不管有没有数据都要响应给客户端,响应完以后就挂掉电话,然后周而复始;
长轮询则是客户端打一个电话,开始一直等,直到服务器有响应,如果服务器一直不响应,这个请求就一直挂在那边。
很显然,这两种方案都有各自弊端。
方案1:每隔一定时间去轮询服务器,这个时间的设置很关键,太长了,即时性得不到保证,太短了,有可能会造成服务器性能的浪费(主要是cpu),假设在一个小时之内都没有一个订单,但是客户端还是不间断的每分钟发一次请求,这些请求就是浪费。
方案2:方案2的出现本来是为了解决方案1这种盲目不确定地发送请求造成浪费的弊端,但是它自己同样也有弊端,首先,它采取阻塞的方式来强迫连接长时间保持,而对于服务器而言,在同一个时间里面能处理的连接数(我们称之为程序的并发数)是有限的,而长轮询方式很容易造成服务端达到并发的限制,因为它不像短轮询一样会很快释放掉连接。
它们的共同的缺点是,每一次请求和响应,处理处理真正有用的数据,服务器和客户端还要交换一堆请求头,响应头等东西,信息交换的效率不高。事实上可以说,长轮询是一种伪长连接,它还是需要遵循http连接的规则:客户端请求--服务器响应--释放连接,顺便交换了一些相同的无用的信息。(造成带宽浪费)
websocket的原理网上有很多人也介绍了,简单来说,它就是html5中的一种协议,我的理解是,他是对html的长连接的一种升级。你也可以将它理解成一种长连接。只不过这种长连接相对于方案2的长轮询有以下优越之处。
1.首先,websocket连接只需要建立一次,在第一次连接的时候,客户端和服务器会交换必要的信息,如下所示。
可以看到,websocket连接成功后返回的状态码是101.在请求头处,传递过来的connection类型是keep_alive,upgrade。也就是说是keep_alive的升级版。首先keep_alive是属于http1.1协议的范畴。大概的意思就是,在http1.0时代,我建立一个连接就是对应一次request--response的过程。而在1.1时代,新增加了keep-alive,我们可以保持这个连接的生命周期(可以通过nginx等服务器设置keepalive-timeout这个参数来实现),这样做的好处是可以自定义一个连接的存活时间,使得一个连接可以处理多个请求,而不是单单一次请求。设置了keepalive-timeout以后,当一个请求结束以后,我们在等keepalive-timeout这么长的时间,如果没有新的请求,就关闭这个连接。
说到http1.1,我们来看一个http的连接的请求头和响应头。
看到了吧,不一样的地方就在于那个upgrade。所以我们可以这么说,websocket也是一个长连接。但是因为它是升级版,所以它有个好处,就是它只需要建立一次连接,传递一次必要的请求头和响应头信息,之后再传递数据的时候就不需要在交换这些信息了。节省了带宽。
2.websocket是双向的,这也是他跟另外两种方法最大的不同,不管是ajax还是长轮询,他们都是通过客户端发送请求,服务器响应的形式完成信息的交换,这种模式下服务器处于一种被动的角色。而websocket不存在这个问题,websocket的链接一旦建立,服务器和客户端都可以互推信息。
有了这两个优点,在做一些需要即时通信的功能时候,我们首选就是用websocket。
websocket简介的更多相关文章
- WebSocket消息推送(实现进行聊天)和WebSocket简介
WebSocket简介 WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信.特点:事件驱动异步使用ws或者 ...
- 【HTML5】HTML5 WebSocket简介以及简单示例
互联网发展到现在,早已超越了原始的初衷,人类从来没有像现在这样依赖过他:也正是这种依赖,促进了互联网技术的飞速发展.而终端设备的创新与发展,更加速了互联网的进化: HTTP/1.1规范发布于1999年 ...
- WebSocket 简介
在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法 ...
- Windows Azure 网站上的 WebSocket 简介
编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站最近新增了对 WebSocket 协议的支持..NE ...
- websocket ----简介,以及demo
#导报 from dwebsocket.decorators import accept_websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户 ...
- websocket之一:websocket简介
Websocket websocket为一次HTTP握手后,后续通讯为tcp协议的通讯方式. WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTT ...
- 1.轮询、长轮询、websocket简介
一.轮询 前端每隔固定时间向后台发送一次请求,询问服务器是否有新数据 缺点: 延迟,需要固定的轮询时间,不一定是实时数据 大量耗费服务器内存和宽带资源,因为不停的请求服务器,很多时候 并没有新的数 ...
- WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
- 使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
随机推荐
- c++ const全局对象是如何处理的
我主要是记录一个发现,目前我不能解释,先作个记录. const 只是一个 语义约束,由编译器强制实施的.使被约束的对象不能被直接访问修改. 我用 『直接』这词,因为在代码段中 ,用一个const 指针 ...
- SQL Server多表同时查询
今天在练sql server发现多条语句同时使用可以多表同时查询,具体操作如下: 代码示例: USE teachingGOSELECT *FROM dbo.teach_classORDER BY cl ...
- [转载] Hibernate与 MyBatis的比较
转载自http://blog.csdn.net/firejuly/article/details/8190229 最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处. 第一 ...
- ssm+maven 框架整合
开篇简言:maven的存在让ssm框架简单了一个量级,BaseDao的存在又让项目简化了一个量级,希望看到这篇文章的都能深入的了解上面两项,好了,进入主题,构造一个ssm框架 1.准备工具 mave ...
- 发现大量的TIME_WAIT解决办法 -- 修改内核参数
今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库 服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%, ...
- c++用指针交换数组
对于指针一直很迷,今天看了一下指针交换数组,知识量很少,希望能帮助到大家. 利用指针来交换数组主要是为了节省时间嘛,有两种交换方式 第一种是写一个函数把数组传过去然后用swap交换,即可 代码如下: ...
- java 之 原型模式(大话设计模式)
原型模式,在笔者理解看来就是克隆,当我们在创建第一个对象时,已经给对象赋值完毕,此时我们需要一个当前对象的副本,如果没有原型模式,我们会再次创建一个对象,然后后二次赋值,保证两个对象完全一致, 这样我 ...
- C# tostring
GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算法产生 ...
- 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一
简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页 和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...
- 3721:和数-poj
总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和. 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = ...