「JavaScript深入」Socket.IO:基于 WebSocket 的实时通信库
Socket.IO
- Socket.IO 的核心特性
- Socket.IO 的架构解析
- Socket.IO 的工作流程
- Socket.IO 示例:使用 Node.js 搭建实时聊天服务器
- 1. 安装 Socket.IO
- 2. 服务器端代码(Node.js)
- 3. 客户端代码(HTML + JavaScript)
- 4. 房间功能
- 高级功能实现
- 1. 命名空间
- 2. 中间件
- 3. 二进制传输
- 性能优化策略
- 1. 负载均衡
- 2. 资源管理
- 3. 监控与调试
- 安全与可靠性
- 1. 安全机制
- 2. 可靠性保障
- Socket.IO 的优缺点
- 优点
- 缺点
- Socket.IO 的应用场景
- Socket.IO vs WebSocket vs SSE vs MQTT vs WebRTC
- 总结
在现代 Web 应用程序中,实时通信是一个关键需求,比如在线聊天、协作编辑、游戏对战等。Socket.IO 是一个强大的 JavaScript 库,基于 WebSocket,提供了事件驱动的双向通信,并且能够自动回退到其他通信方式(如轮询)以支持更广泛的客户端。
Socket.IO 的核心特性
1. 事件驱动:通信基于事件模型,客户端和服务器可以定义并监听事件。
2. 双向通信:支持服务器和客户端之间的全双工数据传输。
// 服务器发送消息
io.on('connection', (socket) => {socket.emit('message', 'Welcome!');
});// 客户端接收消息
socket.on('message', (data) => {console.log('收到消息:', data);
});
-
全双工通信: 客户端和服务器可以同时发送和接收数据
-
事件驱动: 基于自定义事件的消息传递
-
自动重连: 内置断线重连机制
3. 传输降级支持
-
首选WebSocket:低延迟,高效通信
-
降级方案:
- HTTP长轮询
- AJAX轮询
- JSONP轮询
-
自动切换:根据客户端能力选择最佳传输方式
4. 自动回退机制:如果 WebSocket 不可用,Socket.IO 会自动使用 HTTP 轮询(长轮询或短轮询)。
5. 房间(Rooms)和命名空间(Namespaces):支持将客户端分组,以便更高效的消息推送。
6. 跨平台支持:适用于浏览器、Node.js 服务器、移动端等。
Socket.IO 的架构解析
1. 核心组件
-
Engine.IO: 底层传输层
-
Socket.IO: 高层API封装
-
Adapter: 多节点支持
2. 消息协议
-
Packet类型:
- CONNECT (0)
- DISCONNECT (1)
- EVENT (2)
- ACK (3)
-
二进制支持: 自动检测和优化传输
Socket.IO 的工作流程
1. 客户端连接服务器:客户端通过 WebSocket(或其他回退方案)连接到 Socket.IO 服务器。
2. 事件监听与触发:服务器和客户端可以相互监听和发送事件。
3. 数据交换:通过 JSON 格式在客户端和服务器之间传输数据。
4. 断线重连:Socket.IO 具有自动重连机制,保证稳定性。
Socket.IO 示例:使用 Node.js 搭建实时聊天服务器
1. 安装 Socket.IO
npm install socket.io express
2. 服务器端代码(Node.js)
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');const app = express();
const server = http.createServer(app);
const io = new Server(server);// 新客户端连接
io.on('connection', (socket) => {console.log('A user connected');socket.on('chat message', (msg) => {console.log('Message received:', msg);io.emit('chat message', msg); // 广播给所有连接的客户端});// 客户端断开socket.on('disconnect', () => {console.log('User disconnected');});
});server.listen(3000, () => {console.log('Socket.IO server running on http://localhost:3000');
});
3. 客户端代码(HTML + JavaScript)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Socket.IO Chat</title><script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script><script>document.addEventListener("DOMContentLoaded", function () {const socket = io('http://localhost:3000');// 发送消息const sendMessage = () => {const message = document.getElementById("message").value;socket.emit("chat message", message);};// 接收消息socket.on("chat message", (msg) => {const messages = document.getElementById("messages");const li = document.createElement("li");li.textContent = msg;messages.appendChild(li);});});</script>
</head>
<body><h1>Socket.IO Chat</h1><ul id="messages"></ul><input id="message" type="text" placeholder="Type a message..."><button onclick="sendMessage()">Send</button>
</body>
</html>
4. 房间功能
// 加入房间
socket.join('room1');// 向房间广播
io.to('room1').emit('room message', 'Hello room1!');// 离开房间
socket.leave('room1');
高级功能实现
1. 命名空间
// 创建命名空间
const adminNamespace = io.of('/admin');adminNamespace.on('connection', (socket) => {console.log('Admin connected:', socket.id);
});
2. 中间件
// 认证中间件
io.use((socket, next) => {const token = socket.handshake.auth.token;if (validateToken(token)) {next();} else {next(new Error('未授权'));}
});
3. 二进制传输
// 发送二进制数据
const blob = new Blob(['Hello']);
socket.emit('binary', blob);// 接收二进制数据
socket.on('binary', (data) => {console.log('收到二进制数据:', data);
});
性能优化策略
1. 负载均衡
-
Redis Adapter: 多节点消息同步
-
Nginx配置: WebSocket负载均衡
-
集群部署: 水平扩展
2. 资源管理
-
连接限制: 防止资源耗尽
-
心跳检测: 及时清理无效连接
-
压缩传输: 减少网络开销
3. 监控与调试
-
内置调试: 设置
DEBUG=socket.io*
-
性能指标: 监控连接数和消息吞吐量
-
错误日志: 记录异常连接和错误信息
安全与可靠性
1. 安全机制
-
认证授权: 集成JWT或OAuth
-
数据校验: 严格验证输入数据
-
速率限制: 防止滥用
2. 可靠性保障
-
自动重连: 内置指数退避策略
-
消息确认: 使用ACK机制
-
持久化存储: 重要消息持久化
Socket.IO 的优缺点
优点
✅ 自动回退:如果 WebSocket 不可用,它会自动回退到轮询等其他方案。
✅ 事件驱动:支持自定义事件,让通信更加灵活。
✅ 广播和房间:可以对特定用户群组推送消息,而不是单播或全体广播。
✅ 支持断线重连:网络波动时,Socket.IO 可以自动恢复连接。
缺点
❌ 额外的开销:相比原生 WebSocket,Socket.IO 有额外的封装层,可能会增加带宽消耗。
❌ 不适用于低延迟音视频:WebRTC 是更好的选择。
❌ 服务器负载较高:相比 MQTT,Socket.IO 需要管理更多连接状态,可能导致服务器负载增加。
Socket.IO 的应用场景
- 即时聊天(如 WhatsApp、在线客服)
- 协同编辑(如 Google Docs、多人白板)
- 多人在线游戏(如实时策略游戏、棋类游戏)
- 在线教育(如直播课堂、在线答疑)
- 实时数据更新(如股票行情、体育比分)
Socket.IO vs WebSocket vs SSE vs MQTT vs WebRTC
特性 | Socket.IO | WebSocket | SSE | MQTT | WebRTC |
---|---|---|---|---|---|
连接方式 | 基于 WebSocket,可回退 | 全双工通信 | 服务器 → 客户端 | 发布/订阅 | P2P |
延迟 | 低 | 低 | 中等 | 低 | 极低 |
适用场景 | 即时聊天、游戏、通知 | 高性能双向通信 | 服务器通知 | IoT、消息推送 | 语音/视频通话 |
断线重连 | 内置 | 手动管理 | 自动 | 需要配置 | 需要信令服务器 |
总结
Socket.IO 作为 WebSocket 的增强版本,在实时通信领域具有广泛的应用。它提供了事件驱动、自动回退、广播机制等功能,使其在即时聊天、协作编辑、多人游戏等场景中表现出色。如果需要低功耗 IoT 设备通信,可以考虑 MQTT;如果是高效的音视频通信,WebRTC 是更好的选择。不同的应用场景需要选择合适的实时通信技术,以保证系统的稳定性和性能。
相关文章:
「JavaScript深入」Socket.IO:基于 WebSocket 的实时通信库
Socket.IO Socket.IO 的核心特性Socket.IO 的架构解析Socket.IO 的工作流程Socket.IO 示例:使用 Node.js 搭建实时聊天服务器1. 安装 Socket.IO2. 服务器端代码(Node.js)3. 客户端代码(HTML JavaScript)4. 房间功能 高…...
turnjs图册翻书效果
npm install https://github.com/igghera/turn.js.git //或者 npm install turn.js //import $ from "jquery"; //记得引入jquery import turn.js; // 引入 Turn.jsimport turn from "/utils/turn.min.js";// 引入 Turn.jsinitBook(length) {var that thi…...
大语言模型的训练数据清洗策略
目录 大语言模型的训练数据清洗策略 1. 数据去重与标准化 问题 解决方案 示例代码(Python 实现数据去重): 2. 过滤有害内容 问题 解决方案 示例代码(基于关键词过滤有害内容): 3. 纠正数据不均衡 …...
在 Vue 项目中调用 DeepSeek API(示例篇)
在 Vue 项目中调用 DeepSeek(假设 DeepSeek 是一个提供 API 服务的第三方工具,例如用于搜索、数据分析等),通常需要通过 HTTP 请求与 DeepSeek 的 API 进行交互。以下是一个简单的示例,展示如何在 Vue 项目中调用 DeepSeek API。 实例如下: 安装依赖 首先,确保你的项目中…...
对接股票金融数据源API
StockTV 股票市场API StockTV 提供全面的实时和历史股市数据 API,涵盖全球股票、外汇、期货及市场新闻数据,助力投资者精准把握市场动态。 主要功能 实时和历史股市数据 API 获取全球股票市场的实时行情、历史数据及深度分析,支持多语言查询…...
蓝桥杯关于栈这个数据结构的一个算法题目
文章目录 1.题目概述解释2.思路分析3.代码解析 1.题目概述解释 找出来这个字符串里面重复出现的字符,类似于这个消消乐的游戏; 示例一里面的这个bb是连续的并且是一样的这个字符,因此删除bb,删除之后发现这个aa有一次相邻了&…...
SpringBoot配置文件加载优先级
在Spring Boot项目中,配置属性的优先级是一个重要的概念,它决定了当存在多个配置源时,哪个配置源的属性将被应用。以下是SpringBoot中配置属性的优先级,从最高到最低: 命令行参数: 命令行参数具有最高的优先…...
企业数据治理解决方案(46页PPT)(文末有下载方式)
资料解读:企业数据治理解决方案 详细资料请看本解读文章的最后内容。 在当今数字化时代,数据已成为企业的核心资产,对企业的发展起着至关重要的作用。然而,许多企业在数据管理方面面临诸多挑战,如数据不全、样式繁多、…...
版本控制器Git ,Gitee如何连接Linux Gitee和Github区别
📖 示例场景 假设你和朋友在开发一个「在线笔记网站」,代码需要频繁修改和协作: 只用本地文件管理 每次修改后手动复制文件,命名为 v1.html、v2.html 问题:无法追踪具体改动内容;多人修改易冲突࿱…...
[网安工具] 网安工具库 —— 工具管理手册
0x00:工具管理类 — Tools Management 0x01:信息收集类 — Information Gathering 自动化综合信息收集工具 — ARL 灯塔 0x02:漏洞探测类 — Vulnerability Identification 浏览器渗透辅助插件 —— HackBar 0x03:漏洞利用类…...
在LwIP中,`tcp_recved()`、`tcp_sndbuf()` 和 `tcp_write()`三个函数详细用法及示例
在LwIP中,tcp_recved()、tcp_sndbuf() 和 tcp_write() 是TCP协议栈的核心函数,用于管理接收和发送数据流。以下是它们的详细用法及示例: 1. tcp_recved() 功能 通知协议栈已处理接收数据:当应用层从接收缓冲区读取数据后&#x…...
外卖避雷方案 改进型(个人使用版)
昨天怒花100请教了双尾彗星对外卖避雷的计划。 总结下来是行不通。 1.很容易被水军冲击数据真实性, 1.这种方案是从末端来解决问题,食品卫生问题,最好还是从解决分成方面的问题。 2.这种方案没有解决人们对食品安全的焦虑。 既然这样那只能先弄个只给自己用的避雷程序,打造…...
深度学习与传统算法在人脸识别领域的演进:从Eigenfaces到ArcFace
一、传统人脸识别方法的发展与局限 1.1 Eigenfaces:主成分分析的经典实践 算法原理 Eigenfaces是基于主成分分析(PCA)的里程碑式方法。其核心思想是将人脸图像视为高维向量,通过协方差矩阵计算特征向量(即特征脸&…...
druid开启防火墙之后的bug
bug以及解决方案 不允许执行多个语句不允许有注释部分数据有误识别,抛出异常,导致原本正常执行的语句被中断 解决方案 application.yaml中对于druid配置如下: wall:enabled: true # 开启防火墙config:multi-statement-allow: true # 允许多个…...
代码随想录_动态规划
代码随想录 动态规划 509.斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n…...
指令系统3(算数运算指令)
一.加法指令(ADD): 用于执行 16 位或 32 位的加法运算。 指令格式及功能: ADD Rd, Rm:将寄存器Rd和Rm的值相加,结果存回Rd,即Rd Rd Rm。ADD Rd, Rn, Rm:把寄存器Rn和Rm的值相加&…...
VLLM专题(三十一)—架构概述
本文档提供了vLLM架构的概述。 1. 入口点 vLLM 提供了多个与系统交互的入口点。下图展示了它们之间的关系。 1.1 LLM 类 LLM 类提供了用于进行离线推理的主要 Python 接口,即在不使用单独的模型推理服务器的情况下与模型进行交互。 以下是 LLM 类的使用示例: from vll…...
【操作系统】进程间通信方式
进程间通信方式 前言 / 概述一、管道管道命名管道 二、消息队列三、共享内存四、信号量信号量概述互斥访问条件同步信号 五、socket总结 前言 / 概述 每个进程的用户地址空间都是独立的,⼀般而言是不能互相访问的,但内核空间是每个进程都共享的ÿ…...
Flutter 打包 ipa出现错误问题 exportArchive
一、错误信息: Encountered error while creating the IPA: error: exportArchive: "Runner.app" requires a provisioning profile with the Push Notifications feature. Try distributing the app in Xcode: open /project/your_app/build/ios/archive/Runner.…...
Ubutu20.04安装docker与docker-compose
系统:20.04.6 LTS (Focal Fossa)" 1.配置apt源(在/etc/apt/sources.list中输入以下内容) # deb cdrom:[Ubuntu 20.04.6 LTS _Focal Fossa_ - Release amd64 (20230316)]/ focal main restricted deb http://mirrors.aliyun.com/ubuntu/ focal main restricted …...
Java 反射机制
Java 反射机制 Java 反射机制1. 反射机制简介2. 反射的核心类3. 反射的基本步骤3.1 加载类,获取类的字节码:Class 对象3.2 获取类的构造器:Constructor 对象3.3 获取类的成员变量:Field 对象3.4 获取类的成员方法:Meth…...
前端流式输出实现详解:从原理到实践
前端流式输出实现详解:从原理到实践 前言一、流式输出核心原理1.1 什么是流式输出?1.2 技术优势对比1.3 关键技术支撑 二、原生JavaScript实现方案2.1 使用Fetch API流式处理关键点解析: 2.2 处理SSE(Server-Sent Eventsÿ…...
CTF题目《easy_tornado》(护网杯 2018)Write Up
题目背景与信息收集 初始访问 题目提供三个文件链接: /flag.txt:提示flag位于/fllllllllllllag文件/welcome.txt:关键词render,暗示模板渲染漏洞(SSTI)/hints.txt:提示签名算法md5(cookie_secre…...
暗光增强技术研究进展与产品落地综合分析(2023-2025)
一、引言 暗光增强技术作为计算机视觉与移动影像领域的核心研究方向之一,近年来在算法创新、硬件适配及产品落地方面取得了显著进展。本文从技术研究与产业应用两个维度,系统梳理近三年(2023-2025)该领域的关键突破,并对比分析主流手机厂商的影像技术优劣势。 二、暗光增…...
CAM350-14.6学习笔记-1:导入Gerber文件
CAM350-14.6学习笔记-1:导入Gerber文件 使用自动导入器导入Gerber1:导航栏Home下面的Import——Automatic Import——选择文件路径——Next2:设置每层的类型:3:设置叠层4:弹出层别显示框及Gerber显示 按照Allegro输出的…...
【Zephyr】【二】学习笔记【RTOS系统架构】
Zephyr RTOS 系统架构 整体架构 #mermaid-svg-MENZa2zm9JlGktYP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MENZa2zm9JlGktYP .error-icon{fill:#552222;}#mermaid-svg-MENZa2zm9JlGktYP .error-text{fill:#55…...
Web-Machine-N7靶机通关攻略
获取靶机ip arp-scan -l 端口扫描 nmap xxxx 访问80端口发现没用 扫描目录 gobuster dir -u http:/192.168.117.160 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium,txt -x php,html,txt ,zip 打开exploit.html 点击F12,修改localhost为靶机ip&#…...
CSS 用于图片的样式属性
CSS 设置图像样式 CSS中用于图片的样式属性主要包括以下几个方面: 边框和背景: border:可以设置图片的边框样式、宽度和颜色。例如,img { border: 1px solid #ddd; } 会给图片添加1像素的实线边框,颜色为灰色…...
【工具分享】vscode+deepseek的接入与使用
目录 第一章 前言 第二章 获取Deepseek APIKEY 2.1 登录与充值 2.2 创建API key 第三章 vscode接入deepseek并使用 3.1 vscode接入deepseek 3.2 vscode使用deepseek 第一章 前言 deepseek刚出来时有一段时间余额无法充值,导致小编没法给大家发完整的流程&…...
《Java核心三问:字符串、equals()、hashCode()的隐藏雷区与完美避坑手册》
目录 一.String、StringBuffer、StringBuilder的区别?1. 核心区别总结2. 具体实例演示示例1:不可变性 vs 可变性示例2:线程安全验证 2. 线程安全的关键:synchronized3. 对比StringBuilder的非线程安全4. 可视化执行流程5. 进一步验…...
【Java】TCP网络编程:从可靠传输到Socket实战
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
背包问题——多重背包(C语言)
代码如下: #include<stdio.h>int knapsack(int weight[], int value[], int count[], int n, int capacity) {int* dp (int*)malloc(sizeof(int) * (capacity 1));for (int i 0; i < capacity; i){dp[i] 0;}for (int i 0; i < n; i)//核心代码{fo…...
微服务》》Kubernetes (K8S) 集群配置网络》》Calico
嘻嘻嘻 以Calico 为例子 Calico官网 官网上有安装Calico插件的步骤 步骤 要在主节点 主节点 主节点 执行 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml kubectl get pod --all-namespaces kubec…...
寄存器(内部访问)
内存中字的储存 我们之前提到过,字由两个字节组成,当我们用16位寄存器来储存时,把字分别储存在连续的两个内存单元中,高位字节放在高地址单元中,低位字节则放在低位地址单元中。 例如上图,0、1两个单元存放…...
Vue2 watch侦听器(监听器)
watch侦听器(监听器)功能是监听数据变化,执行一些业务逻辑 或 异步操作。 核心选项 handler 监听函数,接收 (newVal, oldVal) 作为参数。deep: true 深度监听对象/数组内部变化。immediate: true 在组件创建时…...
【PCB工艺】基础:电子元器件
电子原理图(Schematic Diagram)是电路设计的基础,理解电子元器件和集成电路(IC)的作用,是画好原理图的关键。 本专栏将系统讲解 电子元器件分类、常见 IC、电路设计技巧,帮助你快速掌握电子电路…...
linux性能监控的分布式集群 prometheus + grafana 监控体系搭建
prometheusgrafana分布式集群资源监控体系搭建 前言一、安装 prometheus二、在要监控的服务器上安装监听器三、prometheus服务器配置四、grafana配置大屏五、创建Linux监控看板五、监控windows服务器注意事项 前言 Prometheus 是一个开源的 分布式监控系统 和 时间序列数据…...
Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法
文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在:3.如果未找到,可能是内核模块未正确生成。尝试安装 linux-modules-extra:4.再次检查 iwlwifi.ko 是否存在:5.确…...
LinkedList与链表
ArrayList的缺陷 在上一篇博客中,小编已经较为详细得给大家介绍了ArrayList这个结构了。但是ArrayList存在一些缺陷:由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移&am…...
CCF 编程能力认证 C++ 四级宝典
CCF编程能力等级认证(以下简称GESP)2025年四次认证时间分别为:3月22日、6月28日、9月27日、12月20日,认证方式为线下机考,认证语言包括:C、Python和Scratch三种语言,其中Scratch认证为一到四级&…...
信创系统极速文件查找:locate 命令详解
原文链接:信创系统极速文件查找:locate 命令详解 Hello,大家好啊!今天给大家带来一篇信创终端操作系统上 locate 命令详解的文章。在 Linux 及信创终端操作系统(如 统信 UOS、麒麟 KOS)中,查找…...
数据集获取
sklearn数据集 sklearn有四部分数据。其中sklearn的数据集有两部分真实的数据,一部分嵌入到了sklearn库中,即安装好sklearn后就自带了一部分数据,这些数据的规模比较小称为small toy datasets ,还有一部分数据是需要在网上下载的,sklearn提供了下载的api接口,这些数据规…...
三格电子PLC数据采集网关-工业互联的智能枢纽
在工业自动化领域,设备间的数据互通与协议兼容是核心挑战之一。三格电子推出的PLC据采集网关SG-PLC-Private,凭借其多协议兼容、高稳定性和灵活配置能力,成为工业物联网(IIoT)中实现设备互联的关键设备。本文将从产品功…...
【sgFloatDialog】自定义组件:浮动弹窗,支持修改尺寸、拖拽位置、最大化、还原、最小化、复位
sgFloatDialog <template><div :class"$options.name" v-if"visible" :size"size" :style"style"><!-- 托盘头部 --><div class"header" ref"header" dblclick.stop.prevent"dblclic…...
conda 常用命令
常用 Conda 命令整理环境管理 conda create --name 环境名 :创建新环境 conda activate 环境名 :激活环境 conda deactivate:退出环境 conda env list:列出所有环境 conda remove --name 环境名 --all :删除环…...
神聖的綫性代數速成例題10. N維矢量綫性運算、矢量由矢量組綫性表示、N個N維矢量相關性質
N 維矢量綫性運算: 設,是維矢量,是數。加法:。數乘:。 矢量由矢量組綫性表示: 設是n維矢量,若存在一組數,使得,則稱矢量可由矢量組綫性表示。 N 個 N 維矢量相關性質&…...
力扣977. 有序数组的平方(双指针技巧)
Problem: 977. 有序数组的平方 文章目录 题目描述思路Code 题目描述 思路 由于数组是非递减且包含正、负数,则假如我们将数组中的每一个元素取平方并且将其从原始的某一个位置分开成两个数组来看待(一个数组从前往后看,一个数组从后往前看&am…...
单片机flash存储也做磨损均衡
最近在做一个项目,需要保存设置数据,掉电不丢失。那么首先想到的是加个24c02,是一个eeprom,但是客户板太小,没有办法进行扩展。后面就找了一个带ee的OTP单片机,发现擦写次数有限,只有1000次&…...
第7章 类与面向对象
6-1 二维平面上的点操作(Python3) 题目描述 设计一个表示二维平面上点的类 Point。该类应该包含以下功能: 两个私有属性 _x 和 _y,分别表示点的横坐标和纵坐标。 一个构造函数 __init__,用于初始化点的坐标。 一个…...
【算法】力扣 713题:乘积小于 K 的子数组之深入思考
文章目录 前言题目:乘积小于 K 的子数组参考思路方法一:滑动窗口方法二:二分查找 参考题解方法一:滑动窗口解法方法二:二分查找解法 深入思考浮点精度?right - left 1?二分法?哈希优…...