Html5学习笔记——Websocket

Websocket是Html5出来的一个新协议,但它还是依附于Http协议。在传统的Http协议中,请求都是由客户端发起的,而且一个请求对应一个服务器的回应,对于客户端来说发出的请求=收到的回应。Websocket允许服务器主动向客户端推送消息。

Websocket的握手

在客户端发出的Websocket请求中,有一些字段是不同于传统的Http协议字段的,这些字段就告诉服务器,我要发起Websocket连接了。

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket                            (Websocket)
Connection: Upgrade                           (Websocket)
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==   (Websocket)
Sec-WebSocket-Protocol: chat, superchat       (Websocket)
Sec-WebSocket-Version: 13                     (Websocket)
Origin: http://example.com

然后服务器会发送回应,状态码变成101,表示协议从Http切换到Websocket。

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

Websocket解决了之前的哪些问题

在Websocket出现之前,客户端要保持与服务器的消息同步有两种方式:轮询长轮询
在轮询方式中,客户端发起ajax请求,服务器接收到请求,立马开始回应,不管有没有产生客户端想要的数据。这种方式比较浪费宽带、服务器资源。
在长轮询方式中,客户端发起ajax请求,服务器接收到请求,不急着回应,而是看看有没有客户端想要的数据,若有,就回应;若没有,连接就保持着直到有数据。这种方式需要服务器有一定的并发能力。
(从形状上看,轮询倒一下就很像长轮询)

【Reference】

  1. 知乎 https://www.zhihu.com/question/20215561
原文地址:https://www.cnblogs.com/season-peng/p/6804819.html