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

【AI大模型入门】03:文心一言——百度的AI战略,国产大模型的先行者

【AI大模型入门】03:文心一言——百度的AI战略,国产大模型的先行者

【AI大模型入门】03:文心一言——百度的AI战略,国产大模型的先行者 📖 阅读时长:约8分钟 🎯 适合人群:想了解国产大模型发展、或百度AI生态的用户 💡 你将学到:文心一言是什么、背后的技术、核心能力、使用方法 一、文心一言的"出生"背景 2023年3月,就在ChatGPT席卷全球的浪潮里,百度率先发布了国内第一个对标ChatGPT的大模型产品——文心一言(英文名:ERNIE Bot)。 这一步棋走得很早,也很大胆。当时百度创始人李彦宏亲自站台发布,引发了全社会对"国产AI能否追上ChatGPT"的大讨论。 时间轴: 2022.11 ChatGPT 发布,震惊世界 2023.03 文心一言 发布,中国第一个 2023.10 文心大模型4.

LLaMA-Factory 大模型微调平台

LLaMA-Factory 大模型微调平台

目录 文章目录 * 目录 * LLaMA-Factory * LLaMA-Factory + Qwen3-7B + LoRA * 安装部署 * 准备数据集 * 执行微调 * 批量推理和训练效果评估 * LoRA 模型合并导出 * 部署运行微调后的大模型 LLaMA-Factory Llama-Factory 是基于 transformers 库开发的训练、微调、推理一体化平台,支持预训练、指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等多种训练范式。支持使用 Accelerate 或 DeepSpeed 作为训练加速后端。 使用 Llama-Factory 进行微调非常简单,因为其最大的优势在于强大的数据处理与训练配置能力。只要按照官方的文档配置好环境,直接运行对应的脚本即可。 LLaMA-Factory + Qwen3-7B + LoRA 安装部署 * 容器安装 git clone

手把手教你在AutoDL上用LLaMA-Factory微调GPT-OSS-20B模型(LoRA版)

手把手教你在AutoDL上用LLaMA-Factory微调GPT-OSS-20B模型(LoRA版)

本教程详细讲解如何在AutoDL云GPU上使用LLaMA-Factory框架微调GPT-OSS-20B大语言模型,包含完整的环境配置、训练流程、权重合并以及vLLM推理部署全流程。文章最后还分享了笔者踩过的坑和解决方案,建议收藏备用! 前言 最近在做一个智能采购相关的项目,需要对大语言模型进行微调,让它能够更好地理解采购场景的业务需求。在对比了多种方案后,最终选择了LLaMA-Factory + LoRA的组合,原因主要有三点: 1. 开箱即用:LLaMA-Factory提供了非常完善的训练框架,支持多种微调方式 2. 显存友好:LoRA相比全参数微调,显存占用大幅降低 3. 效果不错:在采购对话场景下,LoRA微调已经能够满足业务需求 本文将完整记录从环境配置到模型部署的全过程,希望能够帮助到有同样需求的小伙伴。 一、方案概览 在开始之前,先来看一下整体的技術方案: 组件选择说明微调框架LLaMA-Factory 0.9.4开源的大模型训练框架基础模型GPT-OSS-20B200亿参数的MoE大模型微调方式LoRA低秩适配,显存友好推理引擎vLLM高性能推

Llama Factory隐藏功能:一键生成可部署的API服务

Llama Factory隐藏功能:一键生成可部署的API服务 作为一名移动应用开发者,当你费尽心思微调好一个文本分类模型后,最头疼的问题可能就是:如何将它快速转化为可调用的API接口?本文将手把手教你利用Llama Factory的隐藏功能,无需复杂编码即可生成可部署的API服务,实现从训练到上线的"最短路径"。 这类任务通常需要GPU环境支持,目前ZEEKLOG算力平台提供了包含Llama Factory的预置镜像,可快速部署验证。下面我们从零开始,完整走通这个流程。 为什么需要API服务化? * 应用集成需求:移动端APP通常通过HTTP请求与后端交互,直接调用模型文件几乎不可行 * 资源隔离:将模型部署为独立服务,避免移动设备性能瓶颈 * 版本管理:API接口可保持稳定,后台模型可随时更新替换 提示:Llama Factory内置的API生成功能基于FastAPI框架,默认支持Swagger文档自动生成。 准备工作:检查你的微调成果 在开始API部署前,请确认你已完成以下步骤: 1. 成功微调模型并保存检查点(通常为adapter_model.bin