服务端2月18日 17:59
i18next 国际化怎么测试?翻译缺失和语言切换如何验证?测试 i18next 分三层:翻译函数本身、React 组件集成、边界情况(缺失 key、懒加载)。翻译函数测试最简单——初始化一个独立的 i18next 实例,注入 mock 翻译资源,断言 `t('key')` 的返回值,覆盖简单 key、插值(`{{name}}`)、复数形式。React 组件测试需要用 `I18nextProvider` 包裹被测组件,传入配置好的 i18n 实例,这样组件内的 `useTranslation` 和 `Trans` 才能正常工作。语言切换测试调用 `i18n.changeLanguage()` 后用 `waitFor` 断言 UI 文案变化。缺失 ...服务端2月18日 18:13
WebSocket 连接管理有哪些关键实践?断线重连怎么做?WebSocket 连接管理围绕生命周期展开:建立、保活、重连、清理。建立时客户端发起连接,服务端做鉴权和元数据登记(用户 ID、设备信息),然后双方进入通信状态。保活用心跳机制——客户端定时发 ping,服务端回 pong,超时未收到 pong 则认为连接已死,这是检测"半开连接"(对端已断开但本端不知道)的唯一可靠手段。重连是客户端的职责,核心策略是指数退避:首次 1 秒后重试,之后 2s、4s、8s,上限 30s,避免服务端刚恢复就被雪崩式重连打垮。加随机抖动(jitter)防止大量客户端同时重连。清理是关闭连接后释放定时器、事件监听器、内存中的消息队列等资源,避免泄漏。
## ...服务端2月18日 18:13
WebSocket 连接有哪些安全风险?如何防护?WebSocket 的安全威胁主要来自四方面:窃听、劫持、伪造和洪泛。防护的核心是强制 WSS(TLS 加密)防止窃听,验证 Origin 头防止跨站 WebSocket 劫持(CSWSH),在握手阶段或首条消息中完成身份认证防止伪造,速率限制和消息校验防止洪泛和注入攻击。WSS 是底线——ws:// 明文传输下,中间人可以读取甚至篡改所有消息。Origin 验证同样关键:浏览器发起 WebSocket 连接时会自动携带 Cookie,如果服务端不校验 Origin,恶意页面可以伪造用户身份建立连接(即 CSWSH 攻击)。认证方面,URL 查询参数传 token 会泄露到日志,更安全的...服务端2月18日 18:14
WebSocket 性能瓶颈在哪?如何优化?WebSocket 性能优化集中在三个层面:协议层压缩与传输格式、应用层消息策略、架构层连接管理。协议层最有效的是启用 permessage-deflate 扩展,文本消息可压缩 60-80%,但小消息(<1KB)压缩反而增加开销,建议设 threshold=1024,压缩级别用 3(速度与压缩率平衡)。传输格式上,大数据场景用二进制(ArrayBuffer/TypedArray)替代 JSON 字符串,解析更快、体积更小;高频结构化消息可用 Protocol Buffers 或 MessagePack 替代 JSON。应用层关键是消息批处理,把短时间内的多条小消息合并成一条发送,减少网...服务端2月18日 18:16
WebSocket 和 HTTP 有什么区别?为什么需要 WebSocket?WebSocket 是基于 TCP 的全双工通信协议,属于 HTML5 规范的一部分。与 HTTP 最大的区别在于通信模式:HTTP 是请求-响应模型,客户端发起请求后服务端才能返回数据,每次请求都携带完整头部(数百字节),连接完即断;WebSocket 通过 HTTP Upgrade 机制握手一次(客户端发送 `Upgrade: websocket` 头,服务端返回 `101 Switching Protocols`),之后在同一条 TCP 连接上双方可随时互发数据,头部开销仅 2-10 字节。这意味着服务端可以主动推送,延迟从 HTTP 轮询的数百毫秒降到毫秒级,适合聊天、实时行情、...服务端2月18日 18:20
WebSocket 有哪些安全问题?CSWSH/注入/DoS 防御方案WebSocket主要面临五大安全威胁:跨站WebSocket劫持(CSWSH)、数据注入、中间人攻击、认证缺失和拒绝服务。CSWSH是最典型的——浏览器WebSocket握手自带Cookie但不受同源策略约束,攻击者在恶意页面发起ws连接即可冒用用户身份。防御核心是服务端严格校验Origin头,拒绝非白名单来源。数据注入方面,WebSocket帧内容无格式约束,服务端若不做输入验证和转义就写数据库或渲染页面,等同于XSS/SQL注入入口。中间人攻击靠WSS(WebSocket over TLS)加密传输解决,和HTTPS同理。认证授权方面,WebSocket握手阶段无法自定义Heade...服务端2月18日 18:22
WebSocket 性能怎么优化?连接/传输/服务端三层优化策略WebSocket性能优化要从连接、传输、服务端三个层面入手。连接层:用单例模式复用连接,避免重复建连;连接池管理多服务端场景,按负载分配。传输层:消息压缩(pako或服务端gzip)减少带宽;批量发送合并高频小消息;用二进制格式替代JSON减少序列化开销;心跳间隔根据网络环境调优,移动端可适当缩短。服务端:ws库配置maxPayload防大包攻击,合理设置heartbeat超时;客户端设置binaryType为arraybuffer避免Blob转换损耗。负载均衡需用sticky session保证同一客户端请求落到同一服务节点。
## 追问
### 连接复用和连接池有什么区别?
...服务端2月18日 18:23
Node.js 怎么搭建 WebSocket 服务器?ws 库实战指南Node.js 搭建 WebSocket 服务器最主流的方式是用 `ws` 库,轻量且性能好。基础用法只需几行代码:创建 `WebSocket.Server` 实例,监听 `connection` 事件处理消息收发。实际项目中通常把它挂到已有的 HTTP 服务器上,这样 HTTP 和 WS 共用同一端口,部署和运维更方便。认证方面,`ws` 提供 `verifyClient` 回调,在握手阶段拦截非法连接,配合 JWT 做令牌校验即可。房间功能需要自己实现——用 Map 按房间 ID 存储客户端集合,提供 join/leave/broadcast 方法。广播就是遍历房间内所有连接逐个 s...服务端2月18日 18:24
浏览器中 WebSocket 怎么用?API 详解与封装实践创建WebSocket实例即可建立长连接,通过四个事件回调处理通信生命周期:`onopen`连接就绪后用`send()`发消息,`onmessage`接收服务端数据,`onclose`和`onerror`处理断开与异常。协议用`ws://`或加密的`wss://`,消息支持文本、JSON、Blob和ArrayBuffer四种格式。连接状态通过`readyState`判断——0正在连接、1已连接、2正在关闭、3已关闭。收二进制数据前需设置`binaryType`为`"arraybuffer"`或`"blob"`。主动关闭调用`close()`并传入状态码(如1000正常关闭、1001离开页...服务端2月18日 18:26
WebSocket 常见问题怎么排查?连接失败/消息丢失/频繁断开WebSocket连接问题主要集中在四个环节:建立、握手、传输、稳定性。连接无法建立时,先确认服务器是否启动、端口是否正确、防火墙是否放行,再检查协议——本地开发用ws,生产环境必须wss,部分反向代理默认不转发WebSocket升级请求,需显式配置。握手失败通常是服务端校验不通过:Origin白名单未放行、子协议不匹配、认证信息缺失。消息丢失多因连接已断开但客户端未感知,或发送队列溢出被丢弃。连接频繁断开要排查心跳是否缺失、Nginx代理超时配置、网络中间件是否主动杀长连接。调试时重点监听onerror和onclose事件,通过close code定位原因(1006异常关闭、1008策...