webscoket协议
HTTP协议:
超文本传输协议,规定了请求和响应,发送一次请求,对方收到后会回响应
使用在客户端/服务器之上, 客户端可以发出请求, 服务器收到后会根据请求回响应资源
--1次请求必须对应1次响应(短链接: 1次请求和1次响应执行完后会立即断开链接)
HTTP事务完整流程:
- 域名: IP段的映射, 每一个域名都会映射一个IP地址
- 解析请求地址(如果域名,会由运营商提供的DNS解析为真实IP地址) --拿到真实IP地址
- 客户端与服务器建立TCP/IP链接(三次握手) 请求和响应只能在链接中发送
- 通过链接,发送请求
- 服务器根据请求内容,回馈响应
- 服务器主动断开链接(四次挥手)
- 浏览器根据响应内容进行解析/渲染
----衍生问题:为什么请求量/流量大了后,服务器就会卡顿...
服务器在每1ms中,能建立的链接是有限的(根据服务器硬件来决定)
HTTP请求:
GET *POST HEAD DELETE TRACE CONNECT PUT OPTION
浏览器为了实现HTTP协议, 创造了一个对象 XMLHttpRequest, 用来发送请求, 收到响应
-
创造请求对象
let myrequest = new XMLHttpRequest()
-
指定对象的请求URL及请求方式
myrequest.open(?请求方式 , ?URL)
-
发送请求
myrequest.send('key=value&key2=value2')
-
监听响应
myrequest.onreadystatechange = () => { //请求成功 && 响应也要成功 if(myrequest.readyState == 4 && myrequest.status == 200){ myrequest.responseText //服务器返回的结果 } }
轮询(效率有一点低,但是仍然有场景需要使用):
定时器 + HTTP,指定周期请求一次服务器
setInterval(() => {
//请求一次聊天服务器
},1000)
# WEBSOCKET长链接协议:
HTML5时推出的, 应用在客户端/服务器之上的协议. 手机端/小程序/浏览器等客户端,都可以使用此协议当客户端和服务器建立了链接后, 在链接中就没有请求和响应的概念了, 只有推送消息打破了之前1次请求1次响应的规范. 客户端可以随时主动给服务器推送消息, 服务器反之同理.
使用最多的地方: 即时通信
//ws协议,因为建立连接后,不管发不发推送,都会持续消耗服务器资源...没有http性能高
//前端/后端会增加定时器判断,如果>=x分钟还没有发送消息,就会断开ws连接,节约服务器资源
1. 创建WS对象,与服务器建立webscoket链接
```javascript
let ws = new WebSocket('ws接口地址')
//http协议的接口如下
http://xxxxx.xxxx.xxxx:端口 //普通
https://同上 //加密
//webscoket的接口如下
ws://11.22.16.33:端口 //普通
wss://11.22.16.33:端口 //加密
- 监听ws对象是否建立链接成功
ws.onopen = () => { //只要成功,就会触发此回调 }
- 主动推送一个消息给服务器
ws.send('传递的数据,注意和http一样,不支持对象,对象需要JSON转换在发送')
- 监听服务器推送的消息
ws.onmessage = (data) => { //data服务器推送的消息 }
- 前端主动断开链接
ws.close()
注意ws不能发送对象参数,发送以后不会报错,但是没有任何效果!!!!!!
推荐阅读:
扫描二维码,在手机上阅读