什么是Websocket
WebSocket是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
Websocket是一种通信协议,与HTTP不同,HTTP只能实现单项通信,也就是客户端请求服务端,而Websocket是双向数据通信即能使客户端请求服务端又能使服务端推送数据到客户端。
特点:
- 第一次握手时采用的是http协议
- 性能开销小
- 自带跨域请求
- 支持持久连接
- 二进制支持,可以发送文本,和二进制数据
为什么要使用Websocket
就前面的概念和特点就已经有充足的理由让我们使用Websocket,不过他最大的特性是支持长连接,客户端与服务端双向通信,这种特性的好处实在太大了,先来看一个需求 每隔一段时间显示后台给的最新数据,如果没有Websocket我们会用ajax来做,但是HTTP协议是单项通信,请求一次就没了,为了保持数据的更新我们每隔一段时间就要请求服务器或许几秒几分钟,因此我们会给ajax添加一个定时器
代码语言:javascript复制 setInterval(()=>{
$.ajax({
url: 'http://localhost:8080',
dataType:'text',
type:'GET',
success:function(data){
console.log(data)
}
})
},1000)
但是这样的坏处在于隔一段时间就要请求服务器很浪费资源也给服务器带来了很大的压力。 而websocket就很好的解决了这个问题
Websocket协议 部分请求头
代码语言:javascript复制Connection: Upgrade
Host: localhost:8080
Origin: file://
Pragma: no-cache
Sec-WebSocket-Key: infTM/NWqL6ded8db1onXg==
Sec-WebSocket-Version: 13
Upgrade: websocket
其中Connection:Upgrade
和Upgrade: websocket
表示协议将要升级为websocket连接 Sec-WebSocket-Key
标识连接 Sec-WebSocket-Version
表示协议的版本 服务端返回请求头
Connection: Upgrade
Sec-WebSocket-Accept: bCqQLLmSn0zlNbbOdgyKO1FjUg=
Sec-WebSocket-Extensions: permessage-deflate
Upgrade: websocket
建立连接
状态101表示连接的HTTP协议将被更改 type为websocket time : pending表示客户端与服务器一直保持连接。
JS中使用websocket 常用事件 let ws = new WebSocket(‘ws://localhost:8080/‘);//创建一个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) 向服务器发送数据
使用socket.io建立连接 nodejs
代码语言:javascript复制//nodejs
const http = require('http');
const io = require('socket.io');
//
let server = http.createServer((req,res)=>{
}).listen(8080);
//建立websocket连接
let wsServer=io.listen(server);//监听http如果有websocket连接转交websocket
wsServer.on('connection',sock=>{
sock.emit('name','数据');//向客户端发送数据
sock.on('name',function(datas){
//接收客户端数据
console.log(datas);//12
})
})
//前台js
let sock = io.connect('ws://localhost:8080/');
sock.emit('name',12);//发送数据
sock.on('name',name=>{
//接收服务端数据
console.log(name);//数据
})