在我们做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简介的更多相关文章

  1. WebSocket消息推送(实现进行聊天)和WebSocket简介

    WebSocket简介 WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信.特点:事件驱动异步使用ws或者 ...

  2. 【HTML5】HTML5 WebSocket简介以及简单示例

    互联网发展到现在,早已超越了原始的初衷,人类从来没有像现在这样依赖过他:也正是这种依赖,促进了互联网技术的飞速发展.而终端设备的创新与发展,更加速了互联网的进化: HTTP/1.1规范发布于1999年 ...

  3. WebSocket 简介

    在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法 ...

  4. Windows Azure 网站上的 WebSocket 简介

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站最近新增了对 WebSocket 协议的支持..NE ...

  5. websocket ----简介,以及demo

    #导报 from dwebsocket.decorators import accept_websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户 ...

  6. websocket之一:websocket简介

    Websocket websocket为一次HTTP握手后,后续通讯为tcp协议的通讯方式. WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTT ...

  7. 1.轮询、长轮询、websocket简介

    一.轮询 前端每隔固定时间向后台发送一次请求,询问服务器是否有新数据   缺点: 延迟,需要固定的轮询时间,不一定是实时数据 大量耗费服务器内存和宽带资源,因为不停的请求服务器,很多时候 并没有新的数 ...

  8. WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  9. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

随机推荐

  1. Windows定时器学习

    定时器是一个在特定时间或者规则间隔被激发的内核对象.结合定时器的异步程序调用可以允许回调函数在任何定时器被激发的时候执行. 通过调用CreateWaitableTimer()可以创建一个定时器,此函数 ...

  2. netty 入门二 (传输bytebuf 或者pojo)

    基于流的数据传输:在基于流的传输(如TCP / IP)中,接收的数据被存储到套接字接收缓冲器中. 不幸的是,基于流的传输的缓冲区不是数据包的队列,而是字节队列. 这意味着,即使您将两个消息作为两个独立 ...

  3. react native一键分享功能实现&原理和注意点(支持微信、qq、新浪微博等)

    目前手机使用的一键分享SDK比较主流的有两个:一个是ShareSDK,另一个是友盟分享. 又因为友盟功能比较多且比较全,比如说友盟统计.友盟推送等,所以本文重点介绍的是友盟分享功能在rn上的应用以及要 ...

  4. javascript内存管理(堆和栈)和javascript运行机制

    内存基本概念 内存的生命周期: 1.分配所需的内存 2.内存的读与写 3.不需要时将其释放 所有语言的内存生命周期都基本一致,不同的是最后一步在低级语言中很清晰,但是在像JavaScript 等高级语 ...

  5. 《用Java写一个通用的服务器程序》03 处理新socket

    在讲监听器时说过处理的新的socket要尽快返回,监听器调用的是ClientFactory的createPhysicalConnection方法,那么就来看这个方法: public boolean c ...

  6. 关于HTML5新手应该知道的几点知识

    随着移动互联网的快速发展,HTML5迅速崛起,我们的生活的方方面面都被HTML5渗透着.HTML5在PC端.移动端上均应用广泛,被称为Web的未来.而随着Google正式停止支持Swiffy,HTML ...

  7. IDisposeable,Close

    一.资源分类 资源分为托管资源和非托管资源. 非托管资源:所有的windows内核对象(句柄)都是非托管资源,如stream,数据库连接,GDI+和COM对象等,这些资源不受CLR管理. 托管资源:由 ...

  8. js代码大全(各种方法、属性)《转载》

      事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture();  event.sr ...

  9. centos 使用 beyond compare 对比工具

    我这里的环境是centos7桌面版 三条命令安装beyond compare wget http://www.scootersoftware.com/bcompare-4.2.3.22587.x86_ ...

  10. Nginx动静分离实现

    Nginx动静分离实现: Nginx是一种轻量级,高性能,多进程的Web服务器,非常适合作为静态资源的服务器使用,而动态的访问操作可以使用稳定的Apache.Tomcat及IIS等来实现,这里就以Ng ...