什么是websocket、websocket的优点以及它的连接过程

websocket

使用websocket可以在服务器与客户端之间建立一个非HTTP的双向连接,这个连接是实时的也是永久的,除非被显式关闭。服务器可以随时将消息推送到客户端。

它是一个新的基于TCP的的应用层协议,只需要一次连接,以后的数据不需要重新建立连接,可以直接发送,它是基于TCP的,属于和HTTP相同的地位。

它的最大特点就是,服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送消息,是真正的双向平等对话, 属于服务器推送技术的一种。

Websocket的特点

  • 建立在TCP协议上,服务器端的实现比较容易
  • 与HTTP协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用HTTP协议,因此握手时不容易屏蔽,能通过各种HTTP代理服务器。
  • 数据格式比较轻量,性能开销小,通信高效。
  • 可以发送文本,也可以发送二进制数据。
  • 没有同源限制,客户端可以与任意服务器通信。
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是URL

Websocket的优点

  • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
  • HTTP长连接中,每次数据交换除了真正的数据局部分之外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送HTTP header就能交换数据,这显然和原有的HTTP协议有区别,所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)

其他几种与服务器实时通信的方法

  1. AJAX轮询

    AJAX轮询也就是定时发送请求,也就是普通的客户端与服务器通信过程,只不过是无限循环发送,这样,可以保证服务端一旦有最新的消息,就可以被客户端获取。
  2. Long Polling长查询
    Long Polling长查询是客户端和浏览器保持一个长连接,等服务端有消息返回,断开。然后再重新连接,也是个循环的过程。
    客户端发起一个Long Polling ,服务端如果没有数据要返回的话,会hold住请求,等到有数据,就会返回给客户端。客户端又会再次发起一次Long Polling,再重复一次上面的过程。

缺点

上边这两种方式都有个致命的弱点,开销太大,被动性。假设并发很高的话,这对服务器是个考验。而WebSocket一次握手,持久连接,以及主动推送的特点可以解决上边的问题,又不至于损耗性能

WebSocket连接过程

  • 客户端发起HTTP握手,告诉服务器端进行WebSocket协议通讯,并告知WebSocket协议版本。服务器端确认协议版本,升级为WebSocket协议。之后如果有数据需要推送,会主动推送给客户端。
  • 连接开始时,客户端使用HTTP协议和服务器端升级协议,升级完成后,后续数据交换遵循WebSocket协议。

请求:

什么是websocket、websocket的优点以及它的连接过程

Connection: Upgrade 表示要升级协议
Upgrade: websocket 要升级协议到websocket协议
Sec-WebSocket-Version 表示websocket的版本。如果服务端不支持该版本,需要返回一个Sec-WebSocket-Versionheader,里面包含服务端支持的版本号。
Sec-WebSocket-Key 对应服务端响应头的Sec-WebSocket-Accept,由于没有同源限制,websocket客户端可任意连接支持websocket的服务。这个就相当于一个钥匙一把锁,避免多余的,无意义的连接。

响应:

什么是websocket、websocket的优点以及它的连接过程
Sec-WebSocket-Accept: 用来告知服务器愿意发起一个websocket连接, 值根据客户端请求头的Sec-WebSocket-Key计算出来

客户端若想要与支持webScoket的服务器通信,可以使用WebSocket构造函数返回WebSocket对象。

什么是websocket、websocket的优点以及它的连接过程
这样,客户端就会与服务端开始连接

返回的实例对象的属性

  • WebSocket.onopen: 连接成功后的回调

  • WebSocket.onclose: 连接关闭后的回调

  • WebSocket.onerror: 连接失败后的回调

  • WebSocket.onmessage: 客户端接收到服务端数据的回调

  • webSocket.bufferedAmount: 未发送至服务器的二进制字节数

  • WebSocket.binaryType: 使用二进制的数据类型连接

  • WebSocket.protocol : 服务器选择的下属协议

  • WebSocket.url : WebSocket 的绝对路径

  • WebSocket.readyState: 当前连接状态,对应的四个常量

  • WebSocket.close() 关闭当前连接

  • WebSocket.send(data) 向服务器发送数据