WebSocket 提供了全双工通信机制,允许服务器主动发送信息给客户端。与传统的 HTTP 协议相比,WebSocket 可以减少通信握手的次数,提高性能,适用于需要实时数据传输的场景,比如聊天应用、游戏、股票价格更新等。
基本概念
- 全双工通信:客户端和服务器可以同时发送数据,不需要等待对方的响应。
- 持久连接:一旦建立 WebSocket 连接,它会一直保持连接状态,直到客户端或服务器关闭连接。
WebSocket API
1. 建立连接
const socket = new WebSocket('wss://example.com/path');
wss://是 WebSocket 安全协议(WebSocket Secure),类似于 HTTPS。
2. 事件处理
WebSocket 对象会触发几个事件,你可以监听这些事件来处理连接的打开、接收消息、错误和关闭。
socket.addEventListener('open', (event) => {
// 连接打开后,可以发送数据
socket.send('Hello Server!');
});
socket.addEventListener('message', (event) => {
// 接收到消息
console.log('Message from server:', event.data);
});
socket.addEventListener('error', (event) => {
// 发生错误
console.error('WebSocket Error:', event);
});
socket.addEventListener('close', (event) => {
// 连接关闭
console.log('WebSocket connection closed:', event.code, event.reason);
});
3. 发送和接收数据
可以发送字符串或二进制数据。
// 发送字符串
socket.send('Hello WebSocket');
// 发送二进制数据
const binaryData = new Uint8Array([0, 1, 2, 3]);
socket.send(binaryData);
4. 关闭连接
socket.close();
封装 WebSocket
封装 WebSocket 可以创建一个通用的类或函数,方便在不同的项目中复用。
class WebSocketClient {
constructor(url) {
this.socket = new WebSocket(url);
this.initEventListeners();
}
initEventListeners() {
this.socket.addEventListener('open', () => {
console.log('WebSocket connection opened');
});
this.socket.addEventListener('message', (message) => {
this.onMessage(message);
});
this.socket.addEventListener('close', (event) => {
console.log('WebSocket connection closed:', event.code, event.reason);
});
this.socket.addEventListener('error', (error) => {
console.error('WebSocket error:', error);
});
}
onMessage(message) {
// 可以在这里处理接收到的消息
console.log('Received message:', message.data);
}
send(data) {
if (this.socket.readyState === WebSocket.OPEN) {
this.socket.send(data);
} else {
console.error('WebSocket is not connected');
}
}
close() {
this.socket.close();
}
}
使用案例
聊天应用
const chatSocket = new WebSocketClient('wss://example.com/chat');
// 发送消息
chatSocket.send('Hello, this is a message to the server!');
// 处理接收到的消息
chatSocket.onMessage = (message) => {
// 更新 UI,显示消息等
};
实时数据更新
const dataSocket = new WebSocketClient('wss://example.com/data');
// 当接收到股票价格更新时
dataSocket.onMessage = (message) => {
const stockData = JSON.parse(message.data);
// 使用最新的股票价格更新 UI
};
注意事项
- 安全性:使用
wss://协议来加密 WebSocket 连接。 - 后端支持:服务器必须支持 WebSocket 协议。
- 心跳检测:定期发送心跳消息以保持连接活跃,防止因网络问题导致的连接中断。
- 错误处理:妥善处理连接错误和断开连接的情况。
WebSocket 是实现实时通信的强大工具,但也需要考虑安全性、稳定性和用户体验。通过封装 WebSocket,可以创建易于维护和重用的代码,以适应不同的应用场景。