WebSocket是一种网络通信协议,它提供了一个全双工的通信通道,允许服务器与客户端之间进行实时数据交换。与传统的HTTP请求/响应模式不同,WebSocket建立了一个持久的连接,使得数据可以在任何时间点在这两个方向上自由流动。
想象一下你和朋友打电话:传统HTTP就像每次说话都要重新拨号,而WebSocket则像保持通话一直在线。WebSocket是一种持久化的双向通信协议,它只需要一次"握手"就能建立长连接,实现:
与HTTP最大的不同:HTTP是"你问我答",WebSocket是"随时对话"。
// 1. 创建WebSocket连接(ws表示普通连接,wss表示加密连接)
const socket = new WebSocket('ws://localhost:8080');
// 2. 监听连接成功事件
socket.addEventListener('open', (event) => {
console.log('连接成功!');
socket.send('你好服务器!');
});
// 3. 监听服务器消息
socket.addEventListener('message', (event) => {
console.log('收到消息:', event.data);
});
// 4. 发送消息
document.querySelector('#sendBtn').addEventListener('click', () => {
const msg = document.querySelector('#input').value;
socket.send(msg);
});
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
console.log('新客户端连接');
// 接收客户端消息
ws.on('message', (message) => {
console.log(`收到消息: ${message}`);
// 广播给所有客户端
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(`服务器说:${message}`);
}
});
});
});
就像朋友聊天需要时不时说"在吗",WebSocket也需要心跳机制来保持连接健康:
const socket = new WebSocket('ws://localhost:8080');
let heartbeatTimer;
// 启动心跳
function startHeartbeat() {
heartbeatTimer = setInterval(() => {
if (socket.readyState === WebSocket.OPEN) {
socket.send('ping'); // 发送心跳包
}
}, 30000); // 每30秒发送一次
}
// 收到服务器响应
socket.addEventListener('message', (event) => {
if (event.data === 'pong') {
console.log('心跳正常');
// 收到响应则重置计时
}
});
// 连接成功后启动心跳
socket.addEventListener('open', () => {
startHeartbeat();
});
// 关闭时清除心跳
socket.addEventListener('close', () => {
clearInterval(heartbeatTimer);
});
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
let isAlive = true;
// 收到心跳包回应
ws.on('message', (message) => {
if (message === 'ping') {
ws.send('pong');
isAlive = true;
}
});
// 定时检查(每45秒)
const heartbeatCheck = setInterval(() => {
if (!isAlive) {
console.log('心跳超时,断开连接');
return ws.terminate();
}
isAlive = false; // 重置状态等待下次心跳
}, 45000);
// 连接关闭时清除定时器
ws.on('close', () => {
clearInterval(heartbeatCheck);
});
});
可以使用这些事件来处理连接的打开、关闭、错误以及接收消息等情况。
示例代码:
socket.onopen = function (event) {
console.log('连接已打开');
};
socket.onmessage = function (event) {
console.log('接收到消息:', event.data);
};
socket.onclose = function (event) {
console.log('连接已关闭');
};
socket.onerror = function (event) {
console.error('发生错误:', event);
};
WebSocket作为一种强大的实时通信协议,为Web应用带来了前所未有的交互性和实时性。通过掌握WebSocket的基本用法和进阶技巧,可以构建出更加动态和响应迅速的Web应用。同时,也需要注意WebSocket的兼容性问题、安全性隐患以及服务器需求等方面的挑战。