小胡:公子,你今天爲啥寫websocket?html
魏三:由於你家公子我健忘啊,不寫寫一下子我忘了怎麼辦?node
小胡:公子你昨天的es6坑還沒填?es6
魏三:我昨天寫了啥???web
Websocket是一種網絡通訊協議,爲何要新建協議,HTTP協議不能用嗎?HTTP協議有個缺點就是通訊只能由客戶端發起。HTTP協議作不到主動推送數據給客戶端。express
前幾天我去社康看病,能夠掃碼看排隊狀況,看前面排了幾我的。掃完碼以後我就看到頁面不停的在刷新,也就是說頁面不停的在請求後臺。爲何會這樣呢?bash
想要獲取最新的狀況,在HTTP協議裏面須要不停的經過客戶端問服務器,有最新沒有?因此就要不停的發送請求過去。輪詢的越頻繁在用戶多的狀況下發送的請求就越多,服務器的壓力也就越大。因此若是不用WebSocket的話,咱們就只能刷新頁面看最新的狀況。服務器
爲何WebSocket鏈接能夠實現雙向通訊而HTTP鏈接不行呢?實際上HTTP協議是創建在TCP協議之上的,TCP協議自己就實現雙向統統信,可是HTTP協議的請求-應答機制限制了雙向統統信。WebSocket鏈接創建之後,其實只是簡單規定了一下:接下來,我們通訊就不使用HTTP協議了,直接互相發數據吧。websocket
若是這些你都記不住的話,簡單一句人話就是HTTP是單行道,WebSocket是雙行道。 若是你還不清楚,能夠看下我借用大神阮一峯的圖網絡
WebSocket一旦創建了通訊,雙行道創建好後,就能夠實時通訊了。好比股市的實時滾動啦,天氣實時更新啦。app
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你入門了嗎?