當前位置: 妍妍網 > 碼農

WebSocket使用介紹:實作即時雙向通訊

2024-05-19碼農

WebSocket是一種網路通訊協定,它提供了一種在單個TCP連線上進行全雙工通訊的機制。與傳統的HTTP請求/響應模式不同,WebSocket允許伺服器主動向客戶端發送訊息,從而實作即時雙向通訊。這使得WebSocket特別適合於需要即時數據更新的套用場景,如線上聊天、即時股票行情、多人線上遊戲等。

WebSocket的特點

  1. 全雙工通訊 :WebSocket提供雙向通訊能力,即客戶端和伺服器可以同時發送和接收訊息。

  2. 即時性 :與傳統的輪詢或長輪詢相比,WebSocket可以實作真正的即時通訊,減少不必要的網路延遲。

  3. 持久連線 :一旦WebSocket連線建立,它將保持開啟狀態,直到客戶端或伺服器決定關閉連線。

  4. 廣泛的套用場景 :WebSocket適用於需要即時數據更新的各種套用,如線上聊天室、多人協作工具、即時數據流等。

WebSocket API

在瀏覽器中,你可以使用JavaScript的WebSocket API來建立和管理WebSocket連線。以下是一個簡單的WebSocket客戶端範例:

// 建立一個WebSocket連線
var socket = new WebSocket('ws://localhost:8080');
// 監聽連線開啟事件
socket.onopen = function(event{
console.log('WebSocket連線已開啟');
// 連線開啟後,可以向伺服器發送訊息
socket.send('Hello, Server!');
};
// 監聽訊息接收事件
socket.onmessage = function(event{
console.log('收到伺服器訊息:', event.data);
};
// 監聽連線關閉事件
socket.onclose = function(event{
console.log('WebSocket連線已關閉');
};
// 監聽錯誤事件
socket.onerror = function(event{
console.error('WebSocket發生錯誤:', event);
};


在伺服器端,你可以使用各種程式語言和框架來實作WebSocket伺服器。以下是一個使用Node.js和 ws 庫實作的簡單WebSocket伺服器範例:

const WebSocket = require('ws');
// 建立一個WebSocket伺服器
const wss = new WebSocket.Server({ port8080 });
wss.on('connection'functionconnection(ws{
console.log('客戶端已連線');
// 監聽客戶端發來的訊息
ws.on('message'functionincoming(message{
console.log('收到客戶端訊息:', message);
// 處理客戶端訊息,並可以發送響應回客戶端
ws.send('Hello, Client!');
});
// 監聽連線關閉事件
ws.on('close'functionclose() {
console.log('客戶端連線已關閉');
});
});


使用場景舉例:即時線上聊天室

假設我們要建立一個簡單的即時線上聊天室套用。客戶端可以使用上述的WebSocket客戶端程式碼來連線伺服器,並行送和接收訊息。伺服器端則需要維護一個客戶端列表,以便廣播訊息給所有連線的客戶端。

在伺服器端,你可以這樣實作:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port8080 });
const clients = newSet(); // 用於儲存所有連線的客戶端
wss.on('connection'functionconnection(ws{
clients.add(ws); // 將新連線的客戶端添加到列表中
ws.on('message'functionincoming(message{
// 當收到客戶端訊息時,廣播給所有連線的客戶端
clients.forEach(functioneach(client{
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(message); // 廣播訊息給其他客戶端
}
});
});
ws.on('close'functionclose() {
clients.delete(ws); // 從客戶端列表中移除已關閉的連線
});
});

這樣,當一個客戶端發送訊息時,伺服器會將該訊息廣播給所有其他連線的客戶端,從而實作即時線上聊天室的功能。