1、前言

最近有同学问我有没有做过在线咨询功能。同时,公司也刚好让我接手一个 IM 项目。所以今天抽时间记录一下最近学习的内容。

本文主要剖析了 WebSocket 的原理,以及附上一个完整的聊天室实战 Demo (包含前端和后端,代码下载链接在文末)。

2、WebSocket 与 HTTP

WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了。WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。

HTTP 有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个 HTTP 请求合并为一个,但是 Websocket 其实是一个新协议,跟 HTTP 协议基本没有关系,只是为了兼容现有浏览器,所以在握手阶段使用了 HTTP 。

下面一张图说明了 HTTP 与 WebSocket 的主要区别:

WebSocket 的其他特点:

  • 建立在 TCP 协议之上,服务器端的实现比较容易。

  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

  • 数据格式比较轻量,性能开销小,通信高效。

  • 可以发送文本,也可以发送二进制数据。

  • 没有同源限制,客户端可以与任意服务器通信。

  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

3、WebSocket 是什么样的协议,具体有什么优点

首先,WebSocket 是一个持久化的协议,相对于 HTTP 这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的 PHP 生命周期来解释。

HTTP 的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次 HTTP 请求就结束了。

在 HTTP1.1 中进行了改进,使得有一个 keep-alive,也就是说,在一个 HTTP 连接中,可以发送多个 Request,接收多个 Response。但是请记住 Request = Response, 在 HTTP 中永远是这样,也就是说一个 Request 只能有一个 Response。而且这个 Response 也是被动的,不能主动发起。

你 BB 了这么多,跟 WebSocket 有什么关系呢?好吧,我正准备说 WebSocket 呢。

首先 WebSocket 是基于 HTTP 协议的,或者说借用了 HTTP 协议来完成一部分握手。

首先我们来看个典型的 WebSocket 握手


  1. GET /chat HTTP/1.1

  2. Host: server.example.com

  3. Upgrade: websocket

  4. Connection: Upgrade

  5. Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==

  6. Sec-WebSocket-Protocol: chat, superchat

  7. Sec-WebSocket-Version: 13

  8. Origin: http://example.com

熟悉 HTTP 的童鞋可能发现了,这段类似 HTTP 协议的握手请求中,多了这么几个东西。


  1. Upgrade: websocket

  2. Connection: Upgrade

这个就是 WebSocket 的核心了,告诉 Apache 、 Nginx 等服务器:注意啦,我发起的请求要用 WebSocket 协议,快点帮我找到对应的助理处理~而不是那个老土的 HTTP。


  1. Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==

  2. Sec-WebSocket-Protocol: chat, superchat

  3. Sec-WebSocket-Version: 13

首先, Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠我,我要验证你是不是真的是 WebSocket 助理。

然后, Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同 URL 下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~

最后, Sec-WebSocket-Version 是告诉服务器所使用的 WebSocket Draft (协议版本),在最初的时候,WebSocket 协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么 Firefox 和 Chrome 用的不是一个版本之类的,当初 WebSocket 协议太多可是一个大难题。。不过现在还好,已经定下来啦~大家都使用同一个版本:服务员,我要的是13岁的噢→_→

然后服务器会返回下列东西,表示已经接受到请求, 成功建立 WebSocket 啦!


  1. HTTP/1.1 101 Switching Protocols

  2. Upgrade: websocket

  3. Connection: Upgrade

  4. Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

  5. Sec-WebSocket-Protocol: chat

这里开始就是 HTTP 最后负责的区域了,告诉客户,我已经成功切换协议啦~


  1. Upgrade: websocket

  2. Connection: Upgrade

依然是固定的,告诉客户端即将升级的是 WebSocket 协议,而不是 mozillasocket,lurnarsocket 或者 shitsocket。

然后, Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。服务器:好啦好啦,知道啦,给你看我的 ID CARD 来证明行了吧。

后面的, Sec-WebSocket-Protocol 则是表示最终使用的协议。

至此,HTTP 已经完成它所有工作了,接下来就是完全按照 WebSocket 协议进行了。

4、WebSocket 的作用

在讲 WebSocket之前,我就顺带着讲下 ajax轮询 和 long poll 的原理。

4-1、ajax轮询

ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。

场景再现:


  1. 客户端:啦啦啦,有没有新信息(Request)

  2. 服务端:没有(Response)

  3. 客户端:啦啦啦,有没有新信息(Request)

  4. 服务端:没有。。(Response)

  5. 客户端:啦啦啦,有没有新信息(Request)

  6. 服务端:你好烦啊,没有啊。。(Response)

  7. 客户端:啦啦啦,有没有新消息(Request)

  8. 服务端:好啦好啦,有啦给你。(Response)

  9. 客户端:啦啦啦,有没有新消息(Request)

  10. 服务端:。。。。。没。。。。没。。。没有(Response) —- loop

4-2、long poll

long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起请求后,如果没消息,就一直不返回 Response 给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

场景再现:


  1. 客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)

  2. 服务端:额。。 等待到有消息的时候。。来 给你(Response)

  3. 客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop

从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。

何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。

从上面很容易看出来,不管怎么样,上面这两种都是非常消耗资源的。

ajax轮询 需要服务器有很快的处理速度和资源。long poll 需要有很高的并发,也就是说同时接待客户的能力。

所以 ajax轮询 和 long poll 都有可能发生这种情况。


  1. 客户端:啦啦啦啦,有新信息么?

  2. 服务端:正忙,请稍后再试(503 Server Unavailable)

  3. 客户端:。。。。好吧,啦啦啦,有新信息么?

  4. 服务端:正忙,请稍后再试(503 Server Unavailable)

4-3、WebSocket

通过上面这两个例子,我们可以看出,这两种方式都不是最好的方式,需要很多资源。

一种需要更快的速度,一种需要更多的’电话’。这两种都会导致’电话’的需求越来越高。

哦对了,忘记说了 HTTP 还是一个无状态协议。通俗的说就是,服务器因为每天要接待太多客户了,是个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。

所以在这种情况下出现了 WebSocket 。他解决了 HTTP 的这几个难题。首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。所以上面的情景可以做如下修改。


  1. 客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)

  2. 服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)

  3. 客户端:麻烦你有信息的时候推送给我噢。。

  4. 服务端:ok,有的时候会告诉你的。

  5. 服务端:balabalabalabala

  6. 服务端:balabalabalabala

  7. 服务端:哈哈哈哈哈啊哈哈哈哈

  8. 服务端:笑死我了哈哈哈哈哈哈哈

这样,只需要经过一次 HTTP 请求,就可以做到源源不断的信息传送了。

————————————————————————————————————————

webSocket面试题

一、为什么你们项目组中使用WebSocket技术

当我们在处理页面数据自动更新的时候,在使用js不断的请求服务器,查看是否有新数据,如果有就获取到新数据,进行对页面信息的跟新,但是当页面长时间没有更新数据时,这样就会存在资源浪费的情况,所以才会使用WebSocket来解决。

二、UDP和TCP协议的概念

TCP是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。

三、什么是WebSocket?

WebSocket是HTML5一种新的协议,WebSocket是真正实现了全双工通信的服务器向客户端推的互联网技术,是一种在单个TCP连接上进行全双工通讯协议。

四、全双工通讯协议的概念?

全双工是通讯传输的一个术语。通信允许数据在两个方向上同时传输,他在能力上相当于两个单工通信方式的结合。全双工指可以同时进行信号的双向传输。

全双工是:例如我们使用的手机就是全双工,在同一时刻两个用户可以同时给对方传送数据

半双工:例如我们使用的对讲机,当A方按住通话按钮才可以向B方传送数据,B方也是,在同一时刻只有一个用户能够传送数据(A/用户都可以传递信息,但是不能够同时传递)

单工:例如我们看电视时,我们只能接收对方发送的信息,不能够给对方传递信息;

五、WebSocket和Socket的区别是什么?

Socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。而WebSocket则不同,它是一个完整的应用层协议,包含一套标准的API。

六、Http与WebSocket的区别?

http协议是短链接,因为请求之后,都会关闭连接,下次重新请求数据,需要再次打开连接。WebSocket协议是一种长连接,只需要通过一次请求来初始化链接,然后所有的请求和响应都是通过这个TCP链接进行通信。

七、WebSocket中的常用注解有哪些?

@ServerEndpoint 类似与servlet中的 RequestMapping

@OnOpen类似与servlet中的 init()初始化

@OnClose类似与servlet中的destroy() 销毁

@OnMessage类似于servlet中的service请求 (意思就是发送数据的方式 @doPost() / @doGet() 组合)*

websocket原理与应用相关推荐

  1. WebSocket 原理

    WebSocket 原理 转载自个人博客,转载请声明,走啊走的记录:WebSocket 原理 背景 以前的网站为了实现推送功能,使用的方法都是轮询.所谓的轮询就是在特定的时间间隔(例如1秒),由浏览器 ...

  2. WebSocket原理及使用场景(转载)

    由轮询到WebSocket 1 轮询 客户端和服务器之间会一直进行连接,每隔一段时间就询问一次.客户端会轮询,有没有新消息.这种方式连接数会很多,一个接受,一个发送.而且每次发送请求都会有Http的H ...

  3. Websocket——原理及基本属性和方法

    Websocket--原理及基本属性和方法 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP ...

  4. 看完让你彻底搞懂Websocket原理

    2019独角兽企业重金招聘Python工程师标准>>> 本文为转载,尊重原作者的著作版权. 偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websock ...

  5. 【HTTP基础】HTTPS原理及WebSocket原理

    由于HTTP没有加密机制,其传输的内容很容易泄漏,并且HTTP协议没法确认通信方,也无法保证接收到的报文在传输过程中是否被篡改,因此HTTPS是在HTTP协议的基础上提供了加密.认证和完整性保护的功能 ...

  6. 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)

    1.前言 最近有同学问我有没有做过在线咨询功能.同时,公司也刚好让我接手一个 IM 项目.所以今天抽时间记录一下最近学习的内容.本文主要剖析了 WebSocket 的原理,以及附上一个完整的聊天室实战 ...

  7. 深刻理解Websocket原理

    原文: http://www.ihorve.com/?p=508 对Websocket一直很懵逼,前端时间在知乎上看到了一篇文章理解了很多. 一.websocket与http WebSocket是HT ...

  8. 看完让你理解WebSocket原理

    一.先来说一下Websocket是什么?(websocket与http有什么区别呢) WebSocket是html5出的东西(协议),并且是一个持久化的协议(下面将会讲到什么是持久化协议) HTTP是 ...

  9. php websocket 是否在线_看完让你彻底理解WebSocket原理,附实战代码(包含前端和后端)...

    作者:nnngu来源:https://www.cnblogs.com/nnngu/p/9347635.html 1.前言 最近有同学问我有没有做过在线咨询功能.同时,公司也刚好让我接手一个 IM 项目 ...

  10. websocket原理

    WebSocket协议是基于TCP的一种新的协议.它实现了浏览器与服务器全双工(full-duplex)通信.其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信. 1.启动客户端 < ...

最新文章

  1. mfc 开启指定服务器,用MFC实现消息的发送和接收(含服务器)
  2. 堪称艺术品级的应用开发框架,Abp有望超越Spring?
  3. FusionChartsFree在JSP中的用法
  4. 《构建之法》第1.2.3章读后感 以及《硅谷传奇》观后感
  5. 组装计算机什么配置比较好,组装电脑什么配置好 组装电脑配置推荐
  6. ThingWorx公开课圆满结束
  7. 8、双目测距及3D重建python
  8. 溯源系统服务器,区块链溯源服务平台系统架构!
  9. 关于ddk环境的配置
  10. 微信开发者工具开发微信小程序
  11. The connection to the server 192.168.229.131:6443 was refused - did you specify the right host or po
  12. 计算机启动时报警原因,电脑出现报警声怎么办?电脑出现报警声的原因
  13. DeFi之道访谈:如何参与Web3?哪些细分赛道值得关注?
  14. 关于初学C语言的知识总结(1)——学习总结欢迎各位教导与指正
  15. Catia V5-6R2016安装教程 win10系统
  16. #BDA#笔记#阶段二:实践报告撰写备考
  17. CF contest/389
  18. springboot基于vue.js的掌上博客系统的设计与实现毕业设计源码063131
  19. 超级好用的安卓手机助手
  20. 《世界上最简单的会计学》

热门文章

  1. 【Milvus的以图搜图】
  2. 【华人学者风采】杨鸣波 四川大学
  3. 小饭馆促销活动流程,小饭馆网络营销方案
  4. 阿里巴巴 淘特技术部 内推
  5. 孙正义与马云的故事:马云就是他心目中的那个人
  6. 在网页中嵌入QQ聊天、阿里旺旺聊天、邮件发送等代码
  7. react报错Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
  8. seo具体是怎么操作的(seo网站优化如何做)
  9. 短信接口被恶意盗刷(验证码短信被盗刷)怎么办?
  10. Win32API大全