介绍 | Socket.IO

介绍 | Socket.IO

If you are new to Socket.IO, we recommend checking out our tutorial.

访问网站
我的收藏179 次访问更新于 a month ago反馈
介绍 | Socket.IO screenshot

详细介绍

介绍

Socket.IO

简介

Socket.IO 是一个库,可以在客户端和服务器之间实现低延迟、双向和基于事件的通信。

Socket.IO 连接可以使用以下不同的底层传输方式建立:

  • HTTP long-polling
  • WebSocket
  • WebTransport

Socket.IO 会根据浏览器的能力(如对各种传输的支持情况)以及网络环境(某些网络会屏蔽 WebSocket 和/或 WebTransport 连接)自动选择最佳可用选项。

双向通信

服务器与客户端实现

Socket.IO 支持多种编程语言的服务器和客户端实现:

服务器端实现

  • JavaScript (Node.js)
  • JavaScript (Deno)
  • Java(两种实现:netty-socketio、socket.io-server-java)
  • Python
  • Golang
  • Rust

客户端实现

  • JavaScript(浏览器、Node.js 或 React Native;另支持微信小程序)
  • Java
  • C++
  • Swift
  • Dart
  • Python
  • .Net
  • Rust
  • Kotlin
  • PHP

Socket.IO 不是什么

  • Socket.IO 不是 WebSocket 实现:尽管 Socket.IO 在可能的情况下使用 WebSocket 进行传输,但它为每个数据包添加了额外的元数据。因此 WebSocket 客户端无法连接到 Socket.IO 服务器,Socket.IO 客户端也无法连接到普通 WebSocket 服务器。如需普通 WebSocket 服务器,可查看 ws 或 µWebSockets.js。
  • Socket.IO 不打算用于移动应用的后台服务:该库会保持与服务器的开放 TCP 连接,可能导致大量电池消耗,此类场景建议使用 FCM 等专用消息平台。

主要功能

相比普通 WebSocket,Socket.IO 提供以下特性:

HTTP 长轮询回退

若无法建立 WebSocket 连接,连接将回退到 HTTP 长轮询。该功能可应对浏览器支持不足或代理配置错误导致的 WebSocket 连接失败。

自动重新连接

Socket.IO 包含心跳机制定期检查连接状态。客户端断开后,会以指数回退延迟自动重新连接,避免压垮服务器。

数据包缓冲

客户端断开连接时,数据包自动缓冲,并在重新连接时发送。

收到后的回调

支持发送事件并接收响应,还可设置超时:

js 复制代码
socket.emit("hello", "world", (response) => {
  console.log(response); // "got it"
});

广播

服务器端可向所有连接客户端或子集(如指定房间)发送事件,在扩展到多节点时同样有效:

js 复制代码
io.emit("hello");
io.to("news").emit("hello");

多路复用

通过命名空间在单个共享连接上拆分逻辑,例如区分普通用户与管理员频道:

js 复制代码
io.of("/admin").on("connection", (socket) => { /* 管理员用户 */ });

常见问题

  • 现在还需要 Socket.IO 吗?
    尽管 WebSocket 已被广泛支持,但使用普通 WebSocket 通常需自行实现重连、确认、广播等 Socket.IO 已提供且经实战测试的功能。
  • 协议数据开销?
    socket.emit("hello", "world") 会发送为 42["hello","world"],每条消息增加几个字节,可通过自定义解析器进一步减少。浏览器包大小为 10.4 kB(压缩后)。

适用场景

Socket.IO 适用于需要在浏览器与服务器之间建立可靠双向实时通信的 Web 应用,例如聊天室、实时仪表盘、协同编辑等。不适用于移动应用后台保活类消息推送场景。

下一步

可参考官方文档的入门示例、服务器安装与客户端安装指南进一步了解。