W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
WebSocket是一種網絡通信協(xié)議,它支持在單個TCP連接上進行全雙工通信,允許服務器主動向客戶端推送信息,客戶端也可以主動向服務器發(fā)送信息,實現真正的雙向平等對話。WebSocket技術基于TCP協(xié)議,與HTTP協(xié)議具有良好的兼容性,數據格式輕量且性能開銷小,可以發(fā)送文本和二進制數據,沒有同源限制,適用于多種應用場景,如在線聊天、實時游戲、股票行情更新等。
WebSocket的實現原理相對簡單,通過在HTTP協(xié)議中添加Upgrade頭部來告知服務器需要升級協(xié)議。如果服務器支持WebSocket協(xié)議,則返回101狀態(tài)碼表示協(xié)議升級成功,之后客戶端和服務器就可以通過WebSocket協(xié)議進行實時通信 。
WebSocket技術的特點包括:
WebSocket的應用場景廣泛,例如:
使用WebSocket技術時,需要先創(chuàng)建WebSocket對象,然后通過該對象與服務器進行通信。WebSocket對象的常用方法包括:
WebSocket與HTTP協(xié)議相比,具有以下優(yōu)勢:
接下來,V哥基于WebSocket,創(chuàng)建一個在線聊天功能的案例,方便用更好的理解 WebSocket 的應用,以下代碼會涉及到前端和后端的編寫。來開干:
我們可以使用Node.js和ws
庫來創(chuàng)建WebSocket服務器。
ws
庫: mkdir websocket-chat
cd websocket-chat
npm init -y
npm install ws
server.js
文件并編寫WebSocket服務器代碼: 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/
為你的項目路徑。clients
集合中。當收到消息時,服務器會將消息廣播給所有其他客戶端。創(chuàng)建一個基于WebSocket的數據推送天氣預報功能,下面 V 哥通過一個案例來演示一下,其中包括一個后端服務器,負責推送天氣更新,以及一個前端頁面,用于顯示實時天氣信息。以下是詳細的步驟說明和代碼解析:
使用Node.js和ws
庫創(chuàng)建WebSocket服務器。
mkdir weather-websocket
cd weather-websocket
npm init -y
npm install ws
server.js
文件并編寫WebSocket服務器代碼: const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
const weatherData = {
temperature: 22, // 假設溫度
condition: 'sunny' // 假設天氣情況
};
// 定時更新天氣數據,模擬實時數據源
setInterval(() => {
weatherData.temperature = Math.floor(Math.random() * 30); // 隨機生成溫度
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/
為你的項目路徑。setInterval
函數每5秒更新一次天氣數據,并將更新推送給所有連接的客戶端。注意哦,在實際應用中,天氣數據可能來自外部API,如果需要可以在聚合數據上找到,并且需要對數據進行身份驗證和加密等安全措施。
WebSocket是一種強大的通信技術,適用于需要實時通信和高交互性的應用場景。掌握利用WebSocket技術,是前端開發(fā)的必備技能。歡迎關注威哥愛編程,一起交流學習,不喜勿噴哦。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: