W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
WebSocket是一種網(wǎng)絡(luò)通信協(xié)議,它支持在單個(gè)TCP連接上進(jìn)行全雙工通信,允許服務(wù)器主動(dòng)向客戶端推送信息,客戶端也可以主動(dòng)向服務(wù)器發(fā)送信息,實(shí)現(xiàn)真正的雙向平等對(duì)話。WebSocket技術(shù)基于TCP協(xié)議,與HTTP協(xié)議具有良好的兼容性,數(shù)據(jù)格式輕量且性能開銷小,可以發(fā)送文本和二進(jìn)制數(shù)據(jù),沒有同源限制,適用于多種應(yīng)用場(chǎng)景,如在線聊天、實(shí)時(shí)游戲、股票行情更新等。
WebSocket的實(shí)現(xiàn)原理相對(duì)簡(jiǎn)單,通過在HTTP協(xié)議中添加Upgrade頭部來告知服務(wù)器需要升級(jí)協(xié)議。如果服務(wù)器支持WebSocket協(xié)議,則返回101狀態(tài)碼表示協(xié)議升級(jí)成功,之后客戶端和服務(wù)器就可以通過WebSocket協(xié)議進(jìn)行實(shí)時(shí)通信 。
WebSocket技術(shù)的特點(diǎn)包括:
WebSocket的應(yīng)用場(chǎng)景廣泛,例如:
使用WebSocket技術(shù)時(shí),需要先創(chuàng)建WebSocket對(duì)象,然后通過該對(duì)象與服務(wù)器進(jìn)行通信。WebSocket對(duì)象的常用方法包括:
WebSocket與HTTP協(xié)議相比,具有以下優(yōu)勢(shì):
接下來,V哥基于WebSocket,創(chuàng)建一個(gè)在線聊天功能的案例,方便用更好的理解 WebSocket 的應(yīng)用,以下代碼會(huì)涉及到前端和后端的編寫。來開干:
我們可以使用Node.js和ws
庫來創(chuàng)建WebSocket服務(wù)器。
ws
庫: mkdir websocket-chat
cd websocket-chat
npm init -y
npm install ws
server.js
文件并編寫WebSocket服務(wù)器代碼: const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
const clients = new Set();
wss.on('connection', function connection(ws) {
clients.add(ws);
ws.on('message', function incoming(message) {
console.log('received: %s', message);
clients.forEach(client => {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
ws.on('close', () => {
clients.delete(ws);
});
});
console.log('WebSocket server started on ws://localhost:8080');
index.html
文件: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebSocket Chat</title>
</head>
<body>
<h1>WebSocket Chat</h1>
<input type="text" id="messageInput" placeholder="Type a message...">
<button id="sendButton">Send</button>
<ul id="messagesList"></ul>
<script src="chat.js"></script>
</body>
</html>
chat.js
文件并編寫前端邏輯: const ws = new WebSocket('ws://localhost:8080');
const messageInput = document.getElementById('messageInput');
const sendButton = document.getElementById('sendButton');
const messagesList = document.getElementById('messagesList');
sendButton.addEventListener('click', () => {
const message = messageInput.value;
if (message) {
ws.send(message);
messageInput.value = '';
}
});
ws.onmessage = (event) => {
const messageItem = document.createElement('li');
messageItem.textContent = event.data;
messagesList.appendChild(messageItem);
};
ws.onopen = () => {
console.log('Connected to the WebSocket server.');
};
ws.onclose = () => {
console.log('Disconnected from the WebSocket server.');
};
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
node server.js
file:///path/to/websocket-chat/index.html
,替換/path/to/websocket-chat/
為你的項(xiàng)目路徑。clients
集合中。當(dāng)收到消息時(shí),服務(wù)器會(huì)將消息廣播給所有其他客戶端。創(chuàng)建一個(gè)基于WebSocket的數(shù)據(jù)推送天氣預(yù)報(bào)功能,下面 V 哥通過一個(gè)案例來演示一下,其中包括一個(gè)后端服務(wù)器,負(fù)責(zé)推送天氣更新,以及一個(gè)前端頁面,用于顯示實(shí)時(shí)天氣信息。以下是詳細(xì)的步驟說明和代碼解析:
使用Node.js和ws
庫創(chuàng)建WebSocket服務(wù)器。
mkdir weather-websocket
cd weather-websocket
npm init -y
npm install ws
server.js
文件并編寫WebSocket服務(wù)器代碼: const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
const weatherData = {
temperature: 22, // 假設(shè)溫度
condition: 'sunny' // 假設(shè)天氣情況
};
// 定時(shí)更新天氣數(shù)據(jù),模擬實(shí)時(shí)數(shù)據(jù)源
setInterval(() => {
weatherData.temperature = Math.floor(Math.random() * 30); // 隨機(jī)生成溫度
weatherData.condition = ['sunny', 'cloudy', 'rainy'][Math.floor(Math.random() * 3)];
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(weatherData));
}
});
}, 5000); // 每5秒更新一次
console.log('WebSocket server started on ws://localhost:8080');
index.html
文件: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Weather Forecast</title>
</head>
<body>
<h1>Live Weather Forecast</h1>
<div>
<p>Temperature: <span id="temperature">--</span>°C</p>
<p>Condition: <span id="condition">--</span></p>
</div>
<script src="app.js"></script>
</body>
</html>
app.js
文件并編寫JavaScript代碼來處理WebSocket連接和UI更新: const ws = new WebSocket('ws://localhost:8080');
const temperatureDisplay = document.getElementById('temperature');
const conditionDisplay = document.getElementById('condition');
ws.onmessage = (event) => {
const weather = JSON.parse(event.data);
temperatureDisplay.textContent = weather.temperature;
conditionDisplay.textContent = weather.condition;
};
ws.onopen = () => {
console.log('Connected to the weather WebSocket server.');
};
ws.onclose = () => {
console.log('Disconnected from the weather WebSocket server.');
};
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
node server.js
file:///path/to/weather-websocket/index.html
,替換/path/to/weather-websocket/
為你的項(xiàng)目路徑。setInterval
函數(shù)每5秒更新一次天氣數(shù)據(jù),并將更新推送給所有連接的客戶端。注意哦,在實(shí)際應(yīng)用中,天氣數(shù)據(jù)可能來自外部API,如果需要可以在聚合數(shù)據(jù)上找到,并且需要對(duì)數(shù)據(jù)進(jìn)行身份驗(yàn)證和加密等安全措施。
WebSocket是一種強(qiáng)大的通信技術(shù),適用于需要實(shí)時(shí)通信和高交互性的應(yīng)用場(chǎng)景。掌握利用WebSocket技術(shù),是前端開發(fā)的必備技能。歡迎關(guān)注威哥愛編程,一起交流學(xué)習(xí),不喜勿噴哦。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: