总结一下h5新增的Web Socket

805 阅读3分钟

1.WebSocket的发展史

在websocket出现之前,web应用的交互过程通常是客户端通过发送请求,服务器接收请求并响应给客户端,但是这样的处理方式,对于实时性要求比较高的、海量并发的应用来说就会有很大的问题;

传统的解决方案: 轮询:就是客户端定时向服务器发出请求,如果服务器当前有数据,就对发送过来的请求作出响应,否则不进行任何处理。问题很明显,每次连接都需要进行TCP的连接,同时大部分的TCP连接是没有任何必要的,当没有数据的时候,发送的请求没有任何意义。


WebSocket的机制

WebSocket是H5一种新协议,他实现了浏览器和服务器的全双工通信,能更好的节省服务器资源和带宽并达到实时通讯。

2.WebSocket和http的区别

相同点:

  • 都是建立在TCP之上的,通过TCP来传输数据 不同点:

  • ws是全双工通信,服务器和客户端都可以主动发送数据,而http只能收到客户端的请求之后服务器才能做出响应。

  • ws是没有同源的影响的,而http受到同源的影响。

  • ws发送的请求会有一个Upgrade:websocket的字段,且connection: Upgrade

  • ws传输的数据是二进制数据或者文本数据,是以帧为单位,而http是以文本数据传输的。

  • ws的建立tcp连接的时候还是需要借助http的,而一旦连接成功,就会从http协议上升到ws协议,今后的处理都是在ws上进行的

  • 传统的http协议是无状态的,每一次连接都需要知道是哪个客户端发送的请求,而ws一旦连接成功之后,服务器会保留所有已经连接的客户端的信息。

3.早期是怎么实现websocket的功能

  • 轮询,解释下什么是轮询:即客户端每隔一定的时间就向服务器发送一次请求,如果有请求结果就返回,没有请求结果则响应空数据。这样的问题就很明显,会存在太多的请求浪费,而且每次http请求都需要建立连接,浪费带宽,效率低下;
  • 长轮询:什么是长轮询(comet):comet技术:就是客户端发送请求,服务器如果有响应就返回响应,然后重新发送请求;但是如果没有响应,则服务器阻塞当前的请求,即:让当前的请求一直处于没有完成的状态,直到有响应数据之后再响应,或者等到连接超时。
  • 长链接:在http协议当中,本应该是无法实现服务器向客户端发送消息的,但是有一种变通的方法,可以让服务器主动发送给客户端,但是方向只能是服务器到客户端,客户端没有能力发送数据。这种变通的方式就是服务器端向客户端声明,接下来要发送的是流信息,也就是说发送的不再是数据包,而是数据流。客户端不会关闭连接,会一直等待服务器端发送数据流过来,通过事件的方式在浏览器中接受数据。

他和websocket的区别:

  • 长连接是单向的,只支持服务端向客户端发送数据流;而websocket是全双工通信。
  • 长连接是发送的文本数据,如果要发送二进制数据则需要进行编码;而websocket是默认支持二进制数据的。
  • 长连接可以自定义事件,但是websocket不行。
  • 长连接使用的是http协议,而websocket使用是ws协议。 前端实现:

image.png

后端实现:

image.png