最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下。

1.什么是Websocket

  Websocket是HTML5中提出的新的协议,注意,这里是协议,可以实现客户端与服务器端的通信,实现服务器的推送功能。

2.Websocket和HTTP协议是什么关系

  简单来说,Websocket和HTTP有关系,但是关系不大,它们的关系类似于数学中的交集,如下图(借用的Ovear的图)。Websocket借用了HTTP协议来完成一部分握手过程。

  

3.Websocket的握手过程

  当客户端要建立Websocket连接时,其向服务器发送:

GET /chat HTTP/1.1
Host: xxx.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://xxx.com
  其中,Upgrade: websocket和Connection: Upgrade告诉服务器,我要建立的是websocket连接;Sec-WebSocket-Key部分服务器加密后还要返回浏览器,确保建立的是websocket连接;Sec-WebSocket-Version: 13是websocket的版本号。
当服务器接收到上述包后,会返回一下内容:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
  它告诉客户端,我已经切换到websocket协议了,Sec-WebSocket-Accept就是Sec-WebSocket-Key加密后的内容,这样,一个websocket连接就建立了。
4.Websocket怎么工作的
      客户端:我要建立websocket连接
      服务器端:好的,已经切换到websocket协议,websocket连接已经建立
        客户端:有什么消息要及时告诉(推送)我
        服务器端:好的
        服务器端:xxxxxx
        服务器端:yyyyyyy
       。。。。。
  其优点就是,只要建立一次连接,就可以连续不断的得到服务器推送的消息,节省带宽和服务器端的压力。
5.Ajax轮询怎么实现的
  其实,这个大多数小伙伴都知道了,ajax轮询模拟长连接就是每个一段时间(0.5s)就向服务器发起ajax请求,查询服务器端是否有数据更新
      客户端:有没有新消息
      服务器端:没有。。(第一次http结束)
      客户端:有没有新消息

      服务器端:有,xxxxx (第二次http结束)
      客户端:有没有新消息

      服务器端:没有。。 (第三次http结束)
      客户端:有没有新消息

      服务器端:没有。。 (第四次http结束)
      。。。。。。
  其缺点显而易见,每次都要建立HTTP连接,即使需要传输的数据非常少,所以这样很浪费带宽;同时,这个过程是被动性的,即不是服务器主动推送的。
6.长连接(long pull)

      客户端:有没有新信息(Request)--第一次http请求开始
      服务端:没有信息,不作回应
      (时间一直的流逝。。。一直保持http连接,当等到有消息的时候)
      服务器端:给你xxxx(Response)--这时,第一次的http请求获得想要的结果,然后还要发起第二、三。。次http请求
      客户端:有没有新消息(Request)--第二次http请求开始
      。。。。。
  其缺点也是显而易见的,同ajax轮询一样,也是每次都要建立HTTP连接,也都是被动的。而且这种方法对服务器的并行要求比较大,因为在没有消息的时候,连接照样保持,而这时需要其它信息是又要建立新的连接(就连接保持中)。
7.参考:

浅谈Websocket、Ajax轮询和长连接(long pull)的更多相关文章

  1. 浅谈Websocket、Ajax轮询和长轮询(long polling)

    浅谈Websocket.Ajax轮询和长轮询(long p0ll) 最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket W ...

  2. WebSocket知识、轮询、长轮询、长连接

    一.WebSocket理论知识 1.什么是websocket WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消 ...

  3. HTTP协议中的短轮询、长轮询、长连接和短连接

    HTTP协议中的短轮询.长轮询.长连接和短连接 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接 ...

  4. ajax轮询与长轮询

      刚刚网了关于轮询的知识,必须拿到自己这里来做个备份了! 其实以前用ajax轮询做个及时数据更新的,只是当时做了不知道那个就是轮询. 首先我们什么时候会想到用轮询技术呢? 一般而言,最多的是及时信息 ...

  5. 轮询、长轮询、长连接、websocket

    Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制,实现即 ...

  6. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  7. 转---谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    作者:伯乐在线专栏作者 - 左潇龙 http://web.jobbole.com/85541/ 如有好文章投稿,请点击 → 这里了解详情 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此 ...

  8. 谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  9. HTTP协议中的短轮询、长轮询、长连接和短连接,看到一篇文章有感

    关于短轮询.长轮询 短轮询主要是前端实现,JS写个死循环,不停的去请求服务器中的库存量是多少,然后刷新到这个页面当中,这其实就是所谓的短轮询. 长轮询主要取决于服务器,在长轮询中,服务器如果检测到数据 ...

随机推荐

  1. ajax跨域请求,页面和java服务端的写法

    方法一(jsonp): 页面ajax请求的写法: $.ajax({ type : "get", async : false, cache : false, url : " ...

  2. 录制iphone手机视频

    1: 升级自己的手机到ios8, 同时mac os也要升级到10.10 2: 用usb数据线将手机连上电脑. 3: 打开quicktime player创建新movie 4: 选择手机作为音频.视频源 ...

  3. 我的第一款windows phone软件

    我的第一个windows phone应用发布成功了,大家支持下,名字叫吕氏春秋,发布人是我的英文名xmfdsh http://www.windowsphone.com/zh-cn/store/app/ ...

  4. 【Asp.Net WebFrom】分页

    Asp.Net WebForm 分页 一. 前言 Asp.Net WebForm 内置的DataPager让人十分蛋疼 本文使用的分页控件是第三方分页控件 AspNetPager,下载地址: 链接: ...

  5. C/C++中内存区域划分大总结

    C++作为一款C语言的升级版本,具有非常强大的功能.它不但能够支持各种程序设计风格,而且还具有C语言的所有功能.我们在这里为大家介绍的是其中一个比较重要的内容,C和C++内存区域的划分. 一. 在c中 ...

  6. ASP.NET - 演练:创建网页以显示 XML 数据

    数据通常是以 XML 格式提供给 Web 应用程序的.但是,XML 数据本质上是分层的,因此您可能希望能够在基于列表的控件中使用 XML 数据,如 GridView 或 DropDownList 控件 ...

  7. iOS第三方支付-微信支付

    微信支付用到的文件 1.首先支持非arc 2.设置URL types 3.AppDelegate - (BOOL)application:(UIApplication *)application di ...

  8. POJ 2017

    #include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("t ...

  9. Server Library [Apache Tomcat v6.0](unbound)服务未绑定解决办法

    (1) 单击File按钮---钩选Show AllWizard——>选择Server——>单击Next (2)Add Library    选择 WTP Server Runtime(My ...

  10. hdu 2873 Bomb Game 博弈论

    SG函数打表,求NIM和!!! 代码如下: #include<cstdio> #include<cstring> #include<iostream> #inclu ...