WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许客户端和服务器之间进行实时双向通信。WebSocket 协议最初由 RFC 6455 定义,并已被广泛应用于实时数据交换、聊天应用、实时游戏等多种场景。
WebSocket 的特点
- 全双工通信:客户端和服务器可以同时发送和接收数据。
- 低延迟:相比于轮询或长轮询等技术,WebSocket 的延迟更低。
- 持久连接:一旦建立连接,就可以一直保持连接状态,直到一方主动关闭连接。
- 高效的数据传输:数据传输格式灵活,可以是文本或二进制数据。
WebSocket 的工作流程
- 握手:客户端通过HTTP请求发起WebSocket连接,服务器响应并完成握手过程。
- 通信:握手完成后,客户端和服务器可以通过WebSocket进行实时双向通信。
- 关闭:任一方可以主动关闭连接。
WebSocket 的握手过程
握手过程是通过HTTP升级请求完成的。客户端发送一个特殊的HTTP请求,服务器响应并完成握手。
握手请求
客户端发送一个带有特定头部的HTTP请求:
plaintext
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
握手响应
服务器响应一个带有特定头部的HTTP响应:
plaintext
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
WebSocket API
WebSocket API 提供了几个主要的方法和事件,用于管理和处理WebSocket连接。
创建WebSocket对象
javascript
const socket = new WebSocket('ws://localhost:8080/chat');
WebSocket的状态
WebSocket 对象有四个状态:
- CONNECTING (0) :正在连接。
- OPEN (1) :连接已建立,可以进行通信。
- CLOSING (2) :连接正在关闭。
- CLOSED (3) :连接已关闭或尚未打开。
WebSocket的主要方法和事件
- onopen:连接成功打开时触发。
- onmessage:接收到消息时触发。
- onerror:发生错误时触发。
- onclose:连接关闭时触发。
- send(data) :向服务器发送数据。
- close() :关闭连接。
示例代码
下面是一个简单的WebSocket客户端和服务器的示例。
客户端示例
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Client</title>
</head>
<body>
<input type="text" id="message" placeholder="Type a message...">
<button onclick="sendMessage()">Send</button>
<ul id="messages"></ul>
<script>
const socket = new WebSocket('ws://localhost:8080/chat');
socket.addEventListener('open', (event) => {
console.log('WebSocket connection opened:', event);
});
socket.addEventListener('message', (event) => {
const messagesList = document.getElementById('messages');
const li = document.createElement('li');
li.textContent = event.data;
messagesList.appendChild(li);
});
socket.addEventListener('error', (event) => {
console.error('WebSocket error:', event);
});
socket.addEventListener('close', (event) => {
console.log('WebSocket connection closed:', event);
});
function sendMessage() {
const messageInput = document.getElementById('message');
const message = messageInput.value;
socket.send(message);
messageInput.value = '';
}
</script>
</body>
</html>
服务器端示例(Node.js)
javascript
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
ws.on('message', (message) => {
console.log('Received:', message);
ws.send(`Echo: ${message}`);
});
ws.on('close', () => {
console.log('WebSocket connection closed');
});
ws.on('error', (error) => {
console.error('WebSocket error:', error);
});
});
console.log('WebSocket server is running on port 8080');
总结
WebSocket 是一种高效的实时通信协议,广泛应用于多种场景,如实时数据交换、聊天应用、实时游戏等。通过合理的配置和使用,可以显著提升应用的实时性和用户体验。
希望这些示例和说明对你有所帮助!如果有更多问题或需要进一步的帮助,请随时提问。