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

专访越擎科技,为什么选择iRobotCAM机器人离线编程软件作为机器人激光加工首选方案

专访越擎科技,为什么选择iRobotCAM机器人离线编程软件作为机器人激光加工首选方案

摘要:激光具备高精度的特性,而激光设备如何实现高精度的应用,不仅涉及设备的硬件精度,也涉及到软件的适配精度。本文通过对话越擎科技CEO,从行业洞察角度,越擎科技研发的iRobotCAM机器人离线编程软件背后的技术架构优势,如何确保实现激光高精度加工适配。 由于激光工艺的高精度的特性,各类激光加工设备应运而生,不断的满足各类的应用场景的需求。而对于设备的精度控制,除了激光器等相关硬件的调试外,软件也是其关键的一环。以机器人激光加工为例,iRobotCAM提供了全面的激光加工工艺模块,可以适配各类不同的机器人,通过其高精度的技术架构的优势,满足各类高精尖或复杂的产品加工需求。 而更具体的讲,作为跨平台架构的iRobotCAM,从全国产的角度来看,选择iRobotCAM作为机器人激光工艺应用软件有哪些明显的优势。 技术层面 * 高精度轨迹算法:基于国产中望3D平台开发的iRobotCAM版本,能够利用中望3D的各类2轴到5轴的轨迹算法,使机器人在激光加工过程中拥有类似CAM软件的精确轨迹算法,可将激光束准确地聚焦在加工部位,实现高精度的激光切割、焊接、雕刻等工艺,确保加工质量和一致性

智慧农业-无人机枸杞树病害检测数据集 深度学习框架基于YOLOV8枸杞病害检测系统 无人机智慧农业枸杞病害巡检

智慧农业-无人机枸杞树病害检测数据集 深度学习框架基于YOLOV8枸杞病害检测系统 无人机智慧农业枸杞病害巡检

无人机枸杞树病害目标检测测数据集 数量:1539张数据集 "训练集:1083""验证集:304"“测试集:152” 类别数量:2个对象类别 类别类型:“healthy健康作物”, “stressed病害作物(如点片状发病区、连片扩散区、叶片卷曲程度、病斑面积占比、初期病斑、局部黄化、大面积枯萎、组织坏死)” 数据集类型图片数量总计1539训练集1083验证集304测试集152 类别信息如下表所示: 类别索引类别名称描述0healthy(健康作物)表示没有受到病害影响的枸杞树区域。1stressed(病害作物)包括点片状发病区、连片扩散区、叶片卷曲程度、病斑面积占比、初期病斑、局部黄化、大面积枯萎、组织坏死等多种病害情况。 这个表格简要概括了您提供的数据集的基本结构和内容。如果您需要更详细的信息或有特定格式的需求,请告知我进一步调整。 1 1 ✅ 一、数据集概览表 项目内容数据集名称无人机枸杞树病害检测数据集总图像数1,539

【verilog语法详解:从入门到精通】

【verilog语法详解:从入门到精通】

verilog语法详解:从入门到精通 * 一、Verilog 核心定位与语法框架 * 二、基础语法:模块与端口 * 三、核心数据类型 * 四、逻辑描述:组合逻辑与时序逻辑 * 五、常用运算符 * 六、控制流语句 * 七、进阶特性:任务与函数、生成块 * 八、语法规范与常见错误 * 九、总结 一、Verilog 核心定位与语法框架 1. 核心特点 并行性:模块内的所有语句(如 assign、always 块)同时执行(对应硬件的并行工作),而非按代码顺序执行。 硬件映射:每段语法都对应明确的硬件(如 reg 对应寄存器,wire 对应导线,and 对应与门)。 层次化:通过

【机器人零件】行星减速器

行星减速器 行星减速器作为精密传动系统的核心部件,在现代工业中扮演着至关重要的角色。本文将全面介绍行星减速器的减速比计算公式、提供C++代码实现实例,并详细分析其应用场景和使用条件。通过深入理解这些内容,工程师和技术人员能够更准确地选择、设计和应用行星减速器,满足各种机械传动需求。 行星减速器基本原理与结构组成 行星减速器,又称行星齿轮减速器,是一种采用行星轮系传动原理的精密减速装置。其基本结构由四个主要部件构成:位于中心的太阳轮(Sun Gear)、围绕太阳轮旋转的行星轮(Planetary Gear)、固定不动的内齿圈(Ring Gear)以及连接行星轮的行星架(Planetary Carrier)。这种独特的结构使得行星减速器能够在紧凑的空间内实现高减速比和大扭矩输出。 行星减速器的工作原理基于齿轮啮合理论,通过太阳轮、行星轮和内齿圈之间的相互作用实现动力传递和转速降低。当电机或其他动力源驱动太阳轮旋转时,行星轮不仅会绕自身轴线自转,还会在行星架的带动下绕太阳轮公转。这种复合运动通过行星架输出,实现减速和增扭的效果。由于多个行星轮同时参与啮合,载荷被均匀分散,这使得行星