前言:

我们实现通信已经有了 HTTP 协议,为什么还需要另一个websocket协议呢?websocket它能带来什么好处?
我相信初学websocket的人都会有这样的疑问,但每个协议的出现,那就肯定有它的用处和好处,能为我们开发带来更加便利好用的效果。你想想,如果我们使用http开发一个即时通讯系统,那该有多麻烦啊。

websocket定义:

websocket协议是基于TCP的一种新的网络协议。它实现了 浏览器 (客户端) 和 服务器 全双工(full-duplex)通信 — 允许服务器主动发送信息给客户端。 (简单说就是实现了客户端和服务端的双向通信,客户端可以发消息给服务端,服务端也可以发送消息给客户端,并且只需要连接一次,连接之后一直保持通信不断开,实现消息的实时推送)

websocket 是一种持久性协议 http 是非持久性协议

1.websocket 和 http的区别

现在我们的网站和APP都会有需要实时推送的消息,例如 双人聊天,聊天室,客服咨询等,都需要消息实时推送。早期没有出现websocket 时,基本都是通过ajax轮询(基于http协议)的方式完成的,但这种方法会消耗很大的性能,而且会有一定的延迟,让我们往下看为什么会这样。

1.什么是WebSocket? - 图1

(1)基于http的ajax轮询

从上图我们可以看出:HTTP是单向的只能客户端发送请求服务器发送响应。 (只能客户端主动发送请求给服务端,而不能服务端主动发送数据给客户端) 举例来说,当客户端向服务器发送请求时,该请求以HTTP或HTTPS的形式发送,在接收到请求后,服务器会将响应发送给客户端。每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭。每个HTTP或HTTPS请求每次都会新建与服务器的连接,并且在获得响应后,连接将自行终止。

HTTP特点: (1)是单向的,只能由客户端发送数据请求,不能由服务端主动给客户端发送数据 (2)发送响应完成之后,客户端与服务器的连接会被关闭

基于上述HTTP的特点,我们想要实现 即时通讯 的话,只能以AJAX轮询的方式来实现
AJAX轮询:客户端定时的给服务器发送请求(例如1s请求一次),服务器把最新的数据响应给服务器

缺点: (1)每次都要建立连接,十分浪费性能和资源 (2)会有延迟,例如 1s 请求一次,那么我们的消息就至少会有 1s 的延迟

(2)websocket

从上图我们可以看到: (1)websocket是双向的客户端 和 服务器 能双向通信 (2)并且当连接建立后,连接会一直保持,一直保持通信

2.websocket在H5中的使用(客户端实现)

在HTML5中,浏览器已经实现了websocket的API,可以直接使用,详情看MDN WebSocket-MDN

(1)创建websocket对象

  1. // 参数1---url: 要连接的URL;这应该是WebSocket服务器将响应的URL。
  2. // 参数2---protocols(可选)一个协议字符串或者一个包含协议字符串的数组,表示指定连接的协议
  3. let ws = new WebSocket(url, [protocols])
  4. //eg. let ws = new WebSocket("ws://localhost:8080")

(2)webSocket.readyState

  1. // 语法
  2. let readyState = WebSocket.readyState;

readyState属性返回实例对象的当前状态,共有四种。

  • CONNECTING:值为0,表示正在连接。
  • OPEN:值为1,表示连接成功,可以通信了。
  • CLOSING:值为2,表示连接正在关闭。
  • CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

(3)websocket事件

事件 事件处理程序 描述
open Socket.onopen 连接建立时触发
message Socket.onmessage 客户端接收服务端数据时触发
error Socket.onerror 通信发生错误时触发
close Socket.onclose 连接关闭时触发

(4)websocket方法

事件 描述
Socket.send( data ) 通过 WebSocket 链接向服务器发送数据
Socket.close( code, reason ) — 两个参数都可选 关闭 WebSocket 连接

3.服务端实现websocket

WebSocket 服务器的实现,我们在后面的文章会详细描述。 常用的 Node 实现WebSocket 服务器可以在npm上搜索:

具体的用法请查看它们的文档,这里不详细介绍了。