胡言乱语websocket

457 阅读3分钟

小胡:公子,你今天为啥写websocket?

魏三:因为你家公子我健忘啊,不写写一会儿我忘了怎么办?

小胡:公子你昨天的es6坑还没填?

魏三:我昨天写了啥???

Websocket是什么?

      Websocket是一种网络通信协议,为什么要新建协议,HTTP协议不能用吗?HTTP协议有个缺点就是通信只能由客户端发起。HTTP协议做不到主动推送数据给客户端。

      前几天我去社康看病,可以扫码看排队情况,看前面排了几个人。扫完码之后我就看到页面不停的在刷新,也就是说页面不停的在请求后台。为什么会这样呢?

      想要获取最新的情况,在HTTP协议里面需要不停的通过客户端问服务器,有最新没有?所以就要不停的发送请求过去。轮询的越频繁在用户多的情况下发送的请求就越多,服务器的压力也就越大。所以如果不用WebSocket的话,我们就只能刷新页面看最新的情况。

      为什么WebSocket连接可以实现双向通信而HTTP连接不行呢?实际上HTTP协议是建立在TCP协议之上的,TCP协议本身就实现双向通通信,但是HTTP协议的请求-应答机制限制了双向通通信。WebSocket连接建立以后,其实只是简单规定了一下:接下来,咱们通信就不使用HTTP协议了,直接互相发数据吧。

      如果这些你都记不住的话,简单一句人话就是HTTP是单行道,WebSocket是双行道。 如果你还不清楚,可以看下我借用大神阮一峰的图

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你入门了吗?