前端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

自动驾驶用户指令解析模型:Llama-Factory交通出行应用

自动驾驶用户指令解析模型:Llama-Factory交通出行应用 在智能汽车日益普及的今天,驾驶员与车辆之间的交互方式正经历深刻变革。过去,我们通过按钮、旋钮或简单的语音命令控制导航;而现在,用户更希望用自然语言表达复杂意图——“前面堵车了,能不能绕一下?”、“找个最近能充电的地方”、“我有点累,帮我找家附近的酒店”。这些看似随意的话语,背后却对系统的语义理解能力提出了极高要求。 传统车载语音系统依赖规则引擎和关键词匹配,面对口语化、多义性甚至隐含需求时常常束手无策。而通用大语言模型虽然具备强大的语言理解能力,但直接部署成本高、响应延迟大,且缺乏领域专业知识。如何在有限资源下,快速构建一个懂交通、听人话、可落地的指令解析模型?这正是 Llama-Factory 所要解决的核心问题。 从数据到部署:一体化微调实践路径 Llama-Factory 并非只是另一个训练脚本集合,它是一个真正面向工程落地的全周期框架。它的价值不在于炫技式的算法堆叠,而在于将复杂的深度学习流程封装成可复用、易操作的标准模块,让团队能把精力集中在“做什么”而非“怎么做”。 以中文交通指令解析任务为例,整

LLaMA Factory 从入门到精通,一篇讲完

LLaMA Factory 从入门到精通,一篇讲完

目录 一、LLaMA-Factory 简介 二、安装部署 三、数据微调 1、数据集的建立 2、数据集格式 3、模型参数 4、开始运行 5、导出模型 四、webui 评估预测与对话 导出 五、SFT 训练 命令行 六、LoRA 合并 合并 量化 七、推理 原始模型推理配置 微调模型推理配置 多模态模型 批量推理 八、评估 通用能力评估 NLG 评估 评估相关参数 一、LLaMA-Factory 简介 LLaMA Factory 是一个简单易用且高效的大型语言模型(Large

Stable-Diffusion-v1-5-archive中文提示词避坑指南:英文翻译策略与参数调优

Stable-Diffusion-v1-5-archive中文提示词避坑指南:英文翻译策略与参数调优 你是不是也遇到过这样的问题:用Stable Diffusion v1.5 Archive生成图片,明明输入了很详细的中文描述,结果出来的图却“货不对板”?要么是细节缺失,要么是风格跑偏,甚至完全理解错了你的意思。 这其实不是你的问题,而是SD1.5模型的一个“先天特性”——它对英文的理解能力远超中文。直接使用中文提示词,就像让一个只会说英语的人去听中文指令,效果自然大打折扣。 别担心,这篇文章就是为你准备的“避坑指南”。我会带你深入理解为什么中文提示词在SD1.5上效果不佳,并分享一套经过验证的、从中文到英文的翻译策略和参数调优方法。看完之后,你就能稳定地生成出符合预期的精美图片,彻底告别“抽卡”式的随机结果。 1. 为什么中文提示词在SD1.5上“水土不服”? 在开始讲“怎么做”之前,我们先要搞清楚“为什么”。理解背后的原因,能帮你更好地应用后面的技巧,而不是死记硬背。 1.1 模型训练的“语言偏好”

体验Stable Diffusion 3.5省钱攻略:比买显卡省90%,按需付费

体验Stable Diffusion 3.5省钱攻略:比买显卡省90%,按需付费 你是不是也遇到过这样的情况:作为自由职业者,客户突然发来一个AI绘画项目需求,说“先做个样图看看效果”。你心里一紧——要测试 Stable Diffusion 3.5 吗?可自己电脑跑不动,租专业显卡又太贵,动辄每月上千元,就为了做几次测试,实在不划算。 别急,我最近发现了一个超低成本的解决方案:用云端算力平台按小时计费的方式,部署 Stable Diffusion 3.5 镜像,完成一次高质量图像生成测试,总成本不到10块钱!相比动辄上万元买显卡或每月固定租赁高端GPU,直接省下90%以上的费用。 这篇文章就是为你量身打造的“小白友好型”实操指南。我会带你一步步从零开始,在ZEEKLOG星图提供的预置镜像环境中,快速启动 Stable Diffusion 3.5,生成专业级图像,并掌握关键参数调优技巧。无论你是设计师、