前言:
我们实现通信已经有了 HTTP 协议,为什么还需要另一个websocket协议呢?websocket它能带来什么好处?
我相信初学websocket的人都会有这样的疑问,但每个协议的出现,那就肯定有它的用处和好处,能为我们开发带来更加便利好用的效果。你想想,如果我们使用http开发一个即时通讯系统,那该有多麻烦啊。
websocket定义:
websocket协议是基于TCP的一种新的网络协议。它实现了 浏览器 (客户端) 和 服务器 全双工(full-duplex)通信 — 允许服务器主动发送信息给客户端。 (简单说就是实现了客户端和服务端的双向通信,客户端可以发消息给服务端,服务端也可以发送消息给客户端,并且只需要连接一次,连接之后一直保持通信不断开,实现消息的实时推送)
websocket 是一种持久性协议 http 是非持久性协议
1.websocket 和 http的区别
现在我们的网站和APP都会有需要实时推送的消息,例如 双人聊天,聊天室,客服咨询等,都需要消息实时推送。早期没有出现websocket 时,基本都是通过ajax轮询(基于http协议)的方式完成的,但这种方法会消耗很大的性能,而且会有一定的延迟,让我们往下看为什么会这样。
(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---url: 要连接的URL;这应该是WebSocket服务器将响应的URL。
// 参数2---protocols(可选)一个协议字符串或者一个包含协议字符串的数组,表示指定连接的协议
let ws = new WebSocket(url, [protocols])
//eg. let ws = new WebSocket("ws://localhost:8080")
(2)webSocket.readyState
// 语法
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上搜索:
具体的用法请查看它们的文档,这里不详细介绍了。