什么是 WebSocket?
WebSocket 是 HTML5 标准的一部分,它提供了一种在客户端和服务器之间进行全双工通信的协议。相比传统的 HTTP 请求-响应模式,WebSocket 允许服务器主动向客户端发送消息,无需客户端频繁轮询。
特点:
- 全双工通信:客户端和服务器可以同时发送和接收数据。
- 实时性强:适合需要低延迟和高频通信的场景,比如在线聊天、游戏、实时通知等。
- 轻量级:相比轮询,大大减少了通信开销,因为它只需要一次握手来建立连接。
- 基于 TCP:WebSocket 使用 HTTP 协议的握手阶段升级为长连接,随后直接在 TCP 上进行通信。
前端如何使用 WebSocket?
WebSocket 在浏览器中通过 WebSocket 对象进行支持。以下是使用步骤:
创建 WebSocket 对象:
const ws = new WebSocket('ws://yourserver.com/socket');
监听连接事件:
ws.onopen = () => {
console.log('WebSocket connection established');
ws.send('Hello Server!');
};监听消息事件:
ws.onmessage = (event) => {
console.log('Message from server:', event.data);
};监听错误事件:
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};监听关闭事件:
ws.onclose = () => {
console.log('WebSocket connection closed');
};发送消息:
ws.send('Your message here');
使用 WebSocket 实现聊天室
后端服务器
后端可以使用 Node.js 的 ws 库来搭建一个 WebSocket 服务。
安装 ws:
npm install ws
实现简单的 WebSocket 服务:
const WebSocket = require('ws');
const os = require('os');
function getLocalIP() {
const interfaces = os.networkInterfaces();
for (const name in interfaces) {
for (const iface of interfaces[name]) {
if (iface.family === 'IPv4' && !iface.internal) {
return iface.address;
}
}
}
return '127.0.0.1'; // 默认返回 localhost
}
const localIP = getLocalIP();
console.log('Local IP Address:', localIP);
const server = new WebSocket.Server({ port: 8090, host: getLocalIP });
server.on('connection', (socket) => {
console.log('A client connected');
// 监听消息
socket.on('message', (message) => {
// console.log(socket)
const text = message.toString();
console.log('Received:', text);
// 广播消息给所有客户端
server.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(text);
}
});
});
// 监听关闭
socket.on('close', () => {
console.log('Client disconnected');
});
});
前端客户端
创建一个简单的聊天界面:
<!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>
<div id="chatbox">
<div id="messages"></div>
<input type="text" id="input" placeholder="Type a message..." />
<button id="send">Send</button>
</div>
<script>
const ws = new WebSocket('ws://192.168.20.33:8090');
const messagesDiv = document.getElementById('messages');
const input = document.getElementById('input');
const sendButton = document.getElementById('send');
ws.onmessage = (event) => {
const message = document.createElement('div');
message.textContent = event.data;
messagesDiv.appendChild(message);
};
sendButton.addEventListener('click', () => {
const message = input.value;
ws.send(message);
input.value = '';
});
</script>
</body>
</html>
启动服务
启动 Node.js 后端:
node server.js
打开 HTML 文件,运行聊天客户端。