小胡:公子,你今天为啥写websocket?
魏三:因为你家公子我健忘啊,不写写一会儿我忘了怎么办?
小胡:公子你昨天的es6坑还没填?
魏三:我昨天写了啥???
Websocket是什么?
Websocket是一种网络通信协议,为什么要新建协议,HTTP协议不能用吗?HTTP协议有个缺点就是通信只能由客户端发起。HTTP协议做不到主动推送数据给客户端。
前几天我去社康看病,可以扫码看排队情况,看前面排了几个人。扫完码之后我就看到页面不停的在刷新,也就是说页面不停的在请求后台。为什么会这样呢?
想要获取最新的情况,在HTTP协议里面需要不停的通过客户端问服务器,有最新没有?所以就要不停的发送请求过去。轮询的越频繁在用户多的情况下发送的请求就越多,服务器的压力也就越大。所以如果不用WebSocket的话,我们就只能刷新页面看最新的情况。
为什么WebSocket连接可以实现双向通信而HTTP连接不行呢?实际上HTTP协议是建立在TCP协议之上的,TCP协议本身就实现双向通通信,但是HTTP协议的请求-应答机制限制了双向通通信。WebSocket连接建立以后,其实只是简单规定了一下:接下来,咱们通信就不使用HTTP协议了,直接互相发数据吧。
如果这些你都记不住的话,简单一句人话就是HTTP是单行道,WebSocket是双行道。 如果你还不清楚,可以看下我借用大神阮一峰的图
WebSocket能干什么?
WebSocket一旦建立了通信,双行道建立好后,就可以实时通信了。比如股市的实时滚动啦,天气实时更新啦。
WebSocket是怎么干的?
WebSocket并不是全新的协议,而是利用了HTTP协议来建立连接。我们来看看WebSocket连接是如何创建的。
先写一个node里面的简单示范
//index.js文件中引入两个模块
const http=require('http');
//封装了WebSocket的模块
const io=require('socket.io');
//起一个http的服务
let httpServer=http.createServer();
httpServer.listen(3000);
//websocket也监听同样的端口
let wsServer=io.listen(httpServer);
wsServer.on('connection',function(sock){
//通信连接成功后,定时发送数据到客户端。
setInterval(function(){
sock.emit("ttt",Math.random())
},500)
})
//第二种方法
// index.js文件
const express = require('express');
const app = express();
// 设置静态文件夹
app.use(express.static(__dirname));
// 通过node的http模块来创建一个server服务
const server = require('http').createServer(app);
// WebSocket是依赖HTTP协议进行握手的
const io = require('socket.io')(server);
// 监听客户端与服务端的连接
io.on('connection', function(socket) {
setInterval(function() {
socket.emit("ttt", Math.random())
}, 500)
});
// 监听3000端口
server.listen(3000);
//使用node index.js起了这个服务后会发送数据到3000端口
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
//引入模块
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
</head>
<body>
<script>
//连接websocket的端口。
let sock=io.connect("ws://localhost:3000/");
//接收数据
sock.on('ttt',function(args){
console.log(`服务器发送了:${args}`);
})
</script>
</body>
</html>
第一种和第二种方法的区别就是,第二种引入了express框架,你可以用http://localhost:3000/index.html访问index.html。按照上面的办法你就可以收到服务器端发送到客户端的数据了,所以WebSocket你入门了吗?