前端WebSocket实战:别再只会用HTTP了

前端WebSocket实战:别再只会用HTTP了

前端WebSocket实战:别再只会用HTTP了

毒舌时刻

这代码写得跟网红滤镜似的——仅供参考。

各位前端同行,咱们今天聊聊前端WebSocket。别告诉我你还在用轮询获取实时数据,那感觉就像每隔一分钟就去敲门问"好了没"——烦人又低效。

为什么你需要WebSocket

最近看到一个项目,实时聊天功能用轮询实现,每秒请求一次服务器,我差点当场去世。我就想问:你是在做实时通信还是在做DDoS攻击?

反面教材

// 反面教材:轮询获取数据 function startPolling() { setInterval(async () => { const response = await fetch('/api/messages'); const messages = await response.json(); updateMessages(messages); }, 1000); // 每秒请求一次 } // 服务器:求放过 // 带宽:我扛不住了 

毒舌点评:这代码,我看了都替你的服务器着急。每秒轮询一次,你是想让服务器变成蜜蜂吗?

前端WebSocket的正确姿势

1. 基础WebSocket使用

// 正确姿势:基础WebSocket class WebSocketClient { constructor(url) { this.url = url; this.ws = null; this.reconnectAttempts = 0; this.maxReconnectAttempts = 5; this.listeners = new Map(); } connect() { this.ws = new WebSocket(this.url); this.ws.onopen = () => { console.log('WebSocket连接成功'); this.reconnectAttempts = 0; this.emit('open'); }; this.ws.onmessage = (event) => { const data = JSON.parse(event.data); this.emit(data.type, data.payload); }; this.ws.onclose = () => { console.log('WebSocket连接关闭'); this.emit('close'); this.reconnect(); }; this.ws.onerror = (error) => { console.error('WebSocket错误:', error); this.emit('error', error); }; } send(type, payload) { if (this.ws && this.ws.readyState === WebSocket.OPEN) { this.ws.send(JSON.stringify({ type, payload })); } } on(event, callback) { if (!this.listeners.has(event)) { this.listeners.set(event, []); } this.listeners.get(event).push(callback); } emit(event, data) { if (this.listeners.has(event)) { this.listeners.get(event).forEach(callback => callback(data)); } } reconnect() { if (this.reconnectAttempts < this.maxReconnectAttempts) { this.reconnectAttempts++; console.log(`尝试重连... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`); setTimeout(() => this.connect(), 3000); } } disconnect() { if (this.ws) { this.ws.close(); } } } // 使用 const ws = new WebSocketClient('wss://api.example.com/ws'); ws.on('open', () => { console.log('连接成功'); }); ws.on('message', (data) => { console.log('收到消息:', data); }); ws.connect(); 

2. React中使用WebSocket

// 正确姿势:React中使用WebSocket import { useEffect, useRef, useState, useCallback } from 'react'; function useWebSocket(url) { const [isConnected, setIsConnected] = useState(false); const [messages, setMessages] = useState([]); const ws = useRef(null); useEffect(() => { ws.current = new WebSocket(url); ws.current.onopen = () => setIsConnected(true); ws.current.onclose = () => setIsConnected(false); ws.current.onmessage = (event) => { const data = JSON.parse(event.data); setMessages(prev => [...prev, data]); }; return () => { ws.current.close(); }; }, [url]); const sendMessage = useCallback((message) => { if (ws.current && ws.current.readyState === WebSocket.OPEN) { ws.current.send(JSON.stringify(message)); } }, []); return { isConnected, messages, sendMessage }; } // 使用 function ChatRoom() { const { isConnected, messages, sendMessage } = useWebSocket('wss://chat.example.com'); const [input, setInput] = useState(''); const handleSend = () => { sendMessage({ type: 'chat', content: input }); setInput(''); }; return ( <div> <div>状态: {isConnected ? '已连接' : '未连接'}</div> <div className="messages"> {messages.map((msg, i) => ( <div key={i}>{msg.content}</div> ))} </div> <input value={input} onChange={e => setInput(e.target.value)} /> <button onClick={handleSend}>发送</button> </div> ); } 

3. 使用Socket.io

// 正确姿势:使用Socket.io import { io } from 'socket.io-client'; const socket = io('https://api.example.com', { transports: ['websocket'], autoConnect: true, reconnection: true, reconnectionAttempts: 5, reconnectionDelay: 3000 }); // 连接事件 socket.on('connect', () => { console.log('连接成功, ID:', socket.id); }); // 断开连接 socket.on('disconnect', () => { console.log('连接断开'); }); // 监听消息 socket.on('message', (data) => { console.log('收到消息:', data); }); // 发送消息 socket.emit('chat message', { text: 'Hello' }); // 加入房间 socket.emit('join room', 'room-1'); // 离开房间 socket.emit('leave room', 'room-1'); 

毒舌点评:早这么写,你的实时通信早做好了。别告诉我你还在用轮询,那你还是趁早去用短信吧。

实战技巧:WebSocket指南

1. WebSocket使用场景

  • 实时聊天:即时通讯
  • 实时数据:股票、比分
  • 协同编辑:多人协作
  • 在线游戏:实时对战

2. 最佳实践

  1. 重连机制:断线自动重连
  2. 心跳检测:保持连接活跃
  3. 消息确认:确保消息送达
  4. 错误处理:优雅处理异常

最后想说的

WebSocket不是新技术,是实时通信的标准。别再只会用HTTP了——WebSocket一下,你的应用会实时起来。

WebSocket就像电话,HTTP就像写信。紧急的事打电话,不急的事写信。别什么事都写信,学会打电话。

Read more

从零部署 Ollama + Qwen 3.5 + OpenClawbot:在本地跑起来你的免费 AI 助手

这篇文章只干一件事: 帮你在一台机器上,把 Ollama + Qwen 3.5 + OpenClaw(OpenClawbot) 整套环境部署起来,并验证能正常聊天。 不讲太多概念,更多是命令 + 配置 + 排错,适合你边看边敲。 一、整体架构先说清楚 这一套技术栈里,各组件的分工是: * Ollama:本地大模型运行引擎,相当于“模型服务端” * Qwen 3.5:具体的大模型(如 qwen3.5-0.8b),在 Ollama 里跑 * OpenClaw / OpenClawbot:在上面封一层“智能代理 + 多通道机器人”(终端、Telegram、后面你也可以接微信等) 简单理解为: 你/用户  →  OpenClawbot  →  Ollama API(http:

【2025年度总结】从代码萌新到万粉博主:AI赋能下的破局与生长

【2025年度总结】从代码萌新到万粉博主:AI赋能下的破局与生长

目录 摘要 📅 前言:起跑与遇见 🚀 第一章:技术筑基 —— 稳扎稳打的创作历程 1.1 从Java速通到前端尝鲜 1.2 啃下C++与Linux这块硬骨头 🤖 第二章:AI破局 —— 拥抱时代的个人成长 2.1 智能体开发:站在巨人的肩膀上 2.2 AI提效编程:手搓系统的降维打击 🌟 第三章:万粉达成 —— 社区与生活的融合 3.1 突破万粉:感恩同行 3.2 博客与生活的平衡术 🔭 结语:2026,行而不辍 摘要 2024年4月敲下第一个字,2025年突破万粉大关。这一年,我从Java图形化编程的“速通”起步,在Linux终端里探索,结束C++的理论学习。更在A佬、小智佬等前辈的指引下,

AI协作天花板!CherryStudio让多模型协同像搭积木

AI协作天花板!CherryStudio让多模型协同像搭积木

文章目录 * 前言 * 【视频教程】 * 1. 本地安装 * 2. 配置模型服务 * 2.1 配置在线模型服务 * 2.2 配置本地模型服务 * 2.3 其他功能简单演示 * 2.3.1 创建智能体 * 2.3.2 AI文生图 * 3. 安装内网穿透工具 * 4. 配置公网地址 * 5. 配置固定公网地址 * 总结 前言 当单个AI还在"单打独斗"时,CherryStudio已经实现了多模型协作的突破!这款开源客户端支持同时接入OpenAI、Gemini、本地Ollama等10+模型,就像一个AI调度中心。最惊艳的是"智能体协作"功能——让GPT分析数据,让Claude写报告,

别等这波 AI 算力浪潮过去才后悔:CANN 应该学什么?

别等这波 AI 算力浪潮过去才后悔:CANN 应该学什么?

别等这波 AI 算力浪潮过去才后悔:CANN 应该学什么? 昇腾 CANN 这几年是真在 “狂飙”,生态越做越大、功能越来越多、文档越写越厚…… 但问题也随之出现: CANN 支持 Python、C++、AscendCL、TBE、MindSpore、PyTorch Frontend、Kernel DSL……这么多"语言",到底学哪个?从哪入门? 别急,今天就给你一次性讲透,看完不再迷茫。 CANN 语言体系到底有多复杂? 整个 CANN 软件栈由多层 API 和 Kernel 构成,所以才会出现一堆「看似不同,实则分工明确」的语言接口 为了简化理解,我们可以把它粗暴分成三层: * 高层:框架调用