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

机器人逆运动学——以六自由度机器人为例(详解、易懂,附全部Matlab代码)

机器人逆运动学——以六自由度机器人为例(详解、易懂,附全部Matlab代码)

前言 前面机器人正运动学主要讲关节变量到末端执行器位姿的关系,也就是知道了关节变量与连杆参数就可以利用D-H参数表来表达末端位姿。而逆运动学就是已知末端的位姿与连杆参数,来求得关节变量的过程。本文首先介绍何为逆运动学,再以例子的形式利用D-H参数表与齐次变换矩阵对机器人进行逆解。 **阅读提醒1:在运动学逆解前,需要掌握运动学正解的相关知识,也要掌握一定的矩阵运算规则。(相关知识点有在我之前的文章提到,我也在本文进行了引用,如有需要可以查阅;我对机器人正运动学相关的matlab分析单独发了一篇博客,有需要也可以查阅) **阅读提醒2:下文灰色补充块是用于解释正文的,用来补充正文没讲到的知识或细节。 一、运动学逆解 上面提到,已知末端执行器的位姿来求解这一位姿对应的全部关节变量就是逆解,然而由于机械结构的差异,有些时候一个末端位姿可能对应着不同的反解情况(多解)。逆运动学问题实质就是非线性超越方程组的求解问题,其解法分为两大类(封闭解法和数值解法),本文主要讲封闭解法。 1.【 封闭解法 】概述 封闭解法是指具有解析形式的解法,其计算速度快、效率高,更便于实时控制,具

AIGC时代编程新宠!如何让孩子通过DeepSeek成为未来的编程大师?

AIGC时代编程新宠!如何让孩子通过DeepSeek成为未来的编程大师?

文章目录 * 一、激发编程兴趣:从游戏开始 * 二、个性化学习计划:DeepSeek的智能推荐 * 三、项目式学习:动手实践,学以致用 * 四、AI精准辅导:即时解答,深度学习 * 五、全面发展:平衡技术与人文 * 六、家长的陪伴与鼓励 * 《信息学奥赛一本通关》 * 本书定位 * 内容简介 * 作者简介 * 目录 在AIGC(Artificial Intelligence Generative Content,人工智能生成内容)技术蓬勃发展的今天,教育领域正经历一场深刻的变革。DeepSeek作为一款由杭州深度求索人工智能基础技术研究有限公司倾力打造的大语言模型工具,正以其卓越的性能和广泛的应用前景,在编程教育领域大放异彩。 一、激发编程兴趣:从游戏开始 孩子的兴趣是学习的最好驱动力。DeepSeek能够生成一系列基于AI的互动编程游戏,这些游戏通过简单的拖拽式编程界面,让孩子在玩乐中学习编程基础。 示例游戏:制作一个简单的“躲避障碍”小游戏 // 使用Scratch风格的伪代码说明 when green

Paperzz 本科文献综述全流程指南:从选题到成稿的智能写作新体验

Paperzz 本科文献综述全流程指南:从选题到成稿的智能写作新体验

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 文献综述https://www.paperzz.cc/journalsReviewed 在本科毕业论文的写作中,文献综述往往是最令人头疼的环节。从选题构思、文献检索到框架搭建和内容填充,每一步都考验着学生的学术能力和耐心。而 Paperzz 平台的文献综述功能,正是为了系统性解决这些痛点而设计的。本文将结合平台界面,为你详细拆解 Paperzz 如何实现从 “输入标题” 到 “生成 AI 原创范文” 的全流程智能辅助,让本科文献综述写作不再是难题。 一、直击痛点:本科文献综述的四大拦路虎 在开始介绍功能前,我们需要先明确本科学生在文献综述写作中普遍面临的困境,这也是 Paperzz 功能设计的出发点。 1. 选题无方向:面对宽泛的研究领域,不知道如何聚焦到一个具体、有研究价值的选题,常常陷入 “大而空” 或 “小而偏” 的误区。 2. 文献难筛选:

2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程

2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程

2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程 作为编程党,谁能拒绝免费的 Copilot Pro?每月省 10 $,解锁无限制代码补全、Anthropic Claude Sonnet 4, GPT-5, Gemini 2.5 Pro等高级模型、每月 300 次 Premium 请求,学生身份认证就能直接白嫖,全程零成本,亲测 2026 年有效!这篇教程把所有步骤、避坑点都捋清楚了,跟着做一遍过,再也不用受免费版额度的气! 前言 先说说为什么一定要冲 Copilot Pro:免费版每月只有 2000 次代码补全 + 50 次聊天请求,写代码刚进入状态就提示额度用完,体验感拉胯;而 Pro