HTML5 WebSocket

HTML5 WebSocket 中文讲解(2025年)

WebSocket 是 HTML5 提供的一种全双工通信协议,通过单个 TCP 连接实现客户端与服务器之间的实时、低延迟通信。相比传统的 HTTP 轮询,WebSocket 支持持久连接,适合实时应用(如聊天、游戏、实时数据推送)。2025年,WebSocket 仍是 Web 开发中的核心技术,广泛用于现代 Web 应用、Kotlin Multiplatform(KMP)项目的 WebView 集成以及物联网(IoT)设备通信。本教程详细讲解 WebSocket 的语法、用法和实践,基于 MDN、W3Schools 和 CSDN,适合初学者和开发者。建议用浏览器开发者工具(F12)或在线 IDE(如 CodePen)练习。


一、WebSocket 概览(必知)

  • 定义:WebSocket 是一种基于 TCP 的协议(ws://wss://),允许客户端和服务器双向发送数据。
  • 核心用途
  • 实时通信:如聊天室、在线游戏。
  • 数据推送:如股票价格、通知。
  • 跨平台集成:如 KMP 中的 WebView 与后端交互。
  • 特点
  • 全双工:客户端和服务器可同时发送和接收数据。
  • 低开销:相比 HTTP,头部更小,效率更高。
  • 跨平台:支持浏览器、Node.js 和嵌入式设备。
  • 2025年趋势
  • WebSocket 在 WebAssembly 和 KMP 项目中用于高效数据传输。
  • 结合 WebRTC 和 Server-Sent Events(SSE)实现复杂实时应用。
  • 安全性增强:wss://(加密 WebSocket)成为标配。

二、核心语法与用法(必会)

以下按客户端(JavaScript)和服务器端(Node.js 示例)讲解,包含代码,可在浏览器或本地运行。

1. 客户端(JavaScript)
  • 创建 WebSocket 连接
  const ws = new WebSocket("ws://example.com:8080");
  • 事件监听
  • onopen:连接建立时触发。
  • onmessage:接收消息时触发。
  • onclose:连接关闭时触发。
  • onerror:错误发生时触发。
  ws.onopen = () => console.log("Connected to server");
  ws.onmessage = (event) => console.log("Received:", event.data);
  ws.onclose = () => console.log("Connection closed");
  ws.onerror = (error) => console.error("Error:", error);
  • 发送消息
  ws.send("Hello, Server!");
  • 关闭连接
  ws.close();
  • 完整示例(客户端)
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Client</title>
</head>
<body>
    <h1>WebSocket Chat</h1>
    <input id="message" type="text" placeholder="Enter message">
    <button onclick="sendMessage()">Send</button>
    <div id="output"></div>
    <script>
        const ws = new WebSocket("ws://localhost:8080");
        const output = document.getElementById("output");

        ws.onopen = () => output.innerHTML += "<p>Connected!</p>";
        ws.onmessage = (event) => output.innerHTML += `<p>Received: ${event.data}</p>`;
        ws.onclose = () => output.innerHTML += "<p>Disconnected!</p>";
        ws.onerror = (error) => output.innerHTML += `<p>Error: ${error}</p>`;

        function sendMessage() {
            const input = document.getElementById("message");
            if (ws.readyState === WebSocket.OPEN) {
                ws.send(input.value);
                output.innerHTML += `<p>Sent: ${input.value}</p>`;
                input.value = "";
            }
        }
    </script>
</body>
</html>


功能:连接 WebSocket 服务器,发送消息并显示接收内容。

2. 服务器端(Node.js 示例)
  • 使用 ws
  npm install ws
  • 服务器代码
const WebSocket = require("ws");
const server = new WebSocket.Server({ port: 8080 });

server.on("connection", (ws) => {
    console.log("Client connected");

    ws.on("message", (message) => {
        console.log(`Received: ${message}`);
        ws.send(`Server: ${message}`); // 回显消息
    });

    ws.on("close", () => console.log("Client disconnected"));

    ws.send("Welcome to the server!");
});

console.log("WebSocket server running on ws://localhost:8080");


功能:启动 WebSocket 服务器,接收客户端消息并回显。

3. WebSocket 状态
  • readyState 属性
  • 0(CONNECTING):连接中。
  • 1(OPEN):连接已建立。
  • 2(CLOSING):关闭中。
  • 3(CLOSED):已关闭。
  if (ws.readyState === WebSocket.OPEN) {
      ws.send("Ready!");
  }
4. 使用 wss://(安全连接)
  • 配置 HTTPS 服务器(需 SSL 证书):
  const https = require("https");
  const fs = require("fs");
  const WebSocket = require("ws");

  const server = https.createServer({
      cert: fs.readFileSync("cert.pem"),
      key: fs.readFileSync("key.pem")
  });
  const wss = new WebSocket.Server({ server });
  server.listen(8080);
  • 客户端连接
  const ws = new WebSocket("wss://example.com:8080");

三、实践示例(综合应用)

  1. 实时聊天室
  • 客户端(扩展前述 HTML):
<!DOCTYPE html>
<html>
<head>
    <style>
        #output { border: 1px solid #ccc; padding: 10px; height: 200px; overflow-y: scroll; }
        #message { width: 200px; }
    </style>
</head>
<body>
    <h1>Chat Room</h1>
    <input id="message" type="text" placeholder="Type a message">
    <button onclick="sendMessage()">Send</button>
    <div id="output"></div>
    <script>
        const ws = new WebSocket("ws://localhost:8080");
        const output = document.getElementById("output");

        ws.onopen = () => output.innerHTML += "<p>Connected to chat!</p>";
        ws.onmessage = (event) => output.innerHTML += `<p>${event.data}</p>`;
        ws.onclose = () => output.innerHTML += "<p>Chat closed</p>";

        function sendMessage() {
            const input = document.getElementById("message");
            if (ws.readyState === WebSocket.OPEN && input.value) {
                ws.send(input.value);
                output.innerHTML += `<p>You: ${input.value}</p>`;
                input.value = "";
            }
        }
    </script>
</body>
</html>
  • 服务器(广播消息):
const WebSocket = require("ws");
const server = new WebSocket.Server({ port: 8080 });

server.on("connection", (ws) => {
    ws.send("Welcome to the chat room!");

    ws.on("message", (message) => {
        const msg = `User: ${message}`;
        server.clients.forEach((client) => {
            if (client.readyState === WebSocket.OPEN) {
                client.send(msg);
            }
        });
    });
});


功能:多客户端聊天室,消息广播给所有连接用户。

  1. KMP 集成(WebView + WebSocket)
import android.os.Bundle
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val webView: WebView = findViewById(R.id.webView)
        webView.settings.javaScriptEnabled = true
        webView.loadData("""
            <html>
            <body>
                <h1>WebSocket Data</h1>
                <div id="output"></div>
                <script>
                    const ws = new WebSocket("ws://localhost:8080");
                    ws.onmessage = (event) => {
                        document.getElementById("output").innerHTML += `<p>${event.data}</p>`;
                    };
                </script>
            </body>
            </html>
        """, "text/html", "UTF-8")
    }
}


布局(res/layout/activity_main.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>


功能:在 Android WebView 中使用 WebSocket 显示实时数据。


四、注意事项与最佳实践

  1. 连接管理
  • 检查 readyState 避免在非 OPEN 状态发送消息:
    javascript if (ws.readyState === WebSocket.OPEN) ws.send(data);
  • 自动重连机制:
    javascript function reconnect() { setTimeout(() => new WebSocket("ws://localhost:8080"), 5000); } ws.onclose = reconnect;
  1. 安全性
  • 使用 wss:// 加密连接,避免数据泄露。
  • 验证服务器身份(SSL 证书)。
  1. 性能优化
  • 限制消息频率,避免服务器过载:
    javascript let lastSent = 0; function sendThrottled(data) { const now = Date.now(); if (now - lastSent > 1000) { ws.send(data); lastSent = now; } }
  • 使用二进制数据(ArrayBuffer)传输大文件:
    javascript ws.binaryType = "arraybuffer"; ws.send(new ArrayBuffer(1024));
  1. 跨平台
  • 在 KMP 项目中,WebSocket 可通过 WebView 或 C++ 模块实现:
    cpp // C++ WebSocket 客户端(使用库如 libwebsocket)
  1. 2025年趋势
  • WebAssembly:WebSocket 与 WASM 结合,提升前端性能。
  • IoT:WebSocket 用于设备实时通信。
  • AI 辅助:VS Code 的 Copilot 可生成 WebSocket 代码。

五、学习建议

  • 练习:用 Node.js 和浏览器实现简单聊天室,测试发送/接收消息。
  • 资源
  • MDN:https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
  • W3Schools:https://www.w3schools.com/js/js_api_websockets.asp
  • CSDN:搜索“HTML5 WebSocket”。
  • 时间:2-3 天掌握基本用法,1 周熟悉服务器和 KMP 集成。
  • 实践:开发实时应用(如聊天、数据仪表盘)。

六、总结

HTML5 WebSocket 必知全双工通信、事件驱动和 ws:///wss://必会客户端连接、消息处理和服务器搭建。2025年,WebSocket 在实时 Web 应用和 KMP 项目中不可或缺,结合 WASM 和 wss:// 更安全高效。相比 HTTP 轮询,WebSocket 低延迟且开销小。

如果需要具体场景代码(如复杂聊天室或 KMP 示例)或有问题,告诉我,我可以提供更详细解答!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注